Débutant en C++ ayant besoin d'aide

r e m y

Membre vénérable
Club iGen
4 Novembre 2000
41 517
4 327
62
St Germain en Laye - FRANCE
Je débute en C++ et je fais donc des exercices de programmation basique

Dans l'un d'eux je dois gérer des comptes bancaires.
J'ai des problèmes avec une variable que j'ai nommée "titulaire" mais que Xcode me demande d'initialiser explicitement (quand je veux lui affecter la valeur c qui est le nom enregistré pour un compte donné)

ErreurC++.jpg


Le message d'erreur semble explicite (il veut que j'initialise titulaire), mais je ne comprends pas pourquoi, ni ce que je dois faire pour ça...

Toute idée, ou piste serait la bienvenue pour m'aider à avancer.

Un grand merci d'avance :up:
 
L'erreur se trouve sans doute dans ta classe "Client". Il doit manquer un constructeur par défaut qui est appelé lors que tu initialises ton objet "Compte". Normalement il peut être généré automatiquement par le compilateur, mais il vaut mieux souvent le définir explicitement. :zen:
 
Ben pour ce qui est de client.h, j'ai ça:

#ifndef Banque_client_h
#define Banque_client_h
#include <string>
#include<vector>
#include "personne.h"
class Compte;
using namespace std;


class Client: public Personne
{
private:
vector<Compte*> compte;
public:
Client(string n);
~Client();
void add_compte(Compte * c);
vector<int> get_comptes();
};


#endif
 
Ajoute un constructeur par défaut sans paramètre. De même si la classe est un peu complexe, il faut aussi prévoir de définir un constructeur de copie :

Client(const Client& src)

PS : pour la compréhension du code, des noms plus explicites que n ou s sont les bien venus :zen:
PS 2 : ne pas oublier les "const" dans les définitions des fonctions, ce n'est pas optionnel ...
 
Dernière édition:
Ok merci, je fais ça de suite

Effectivement, je reconnais que je devrais utiliser des noms plus explicites.

Dans les premiers exercices, je m'en sortais sans mais là, même si ca reste basique, ça commence à se compliquer un peu et même pour moi, ça m'aiderait...

:up:

---------- Nouveau message ajouté à 22h33 ---------- Le message précédent a été envoyé à 21h17 ----------

Ca fonctionne enfin!

Un simple Client() ajouté et hop, plus d'erreur.

Merci de ton aide

Par contre maintenant j'ai un souci lors de la compilation et j'ai l'impression, d'après mes recherche Google, que c'est un problème lié à Os X 10.9:

J'obtiens les erreurs suivantes:

Undefined symbols for architecture x86_64:
"Client::Client()", referenced from:
Compte::Compte(int, Client) in compte.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)


Bizarrement, même si je demande une compilation pour architecture 32 bits seulement (i386), j'ai toujours la première erreur (not found for x86_64)

Quant à la deuxième erreur, j'ai trouvé des fils de discussion qui en parle mais je ne comprends absolument pas ce qu'il faut faire pour passer outre ....

Il me semble qu'il faudrait changer de compileur par défaut:

BuildOptionXcode.jpg


Mais quand je clique sur "Default Compiler LLVM 6.0", je n'ai pas le choix d'un autre compileur et je ne sais pas comment ajouter celui que les fils de discussion que j'ai trouvé mentionne gcc (ou g++)
 
Dernière édition:
Compile en 64 bits, oublie le 32.

Vérifie tes réglages, apparemment l'erreur indique que ton fichier Client a été compilé en 32 bits. Tu dois inclure un header qui tire une vieille librairie C qui est encore en 32 bits. Utilise bien les includes standards C++ (sans le .h dans le nom).

Tout doit compiler avec LLVM, pas de raison d'en utiliser un autre.
 
Merci de tes conseils.
Je regarde ça ce soir et je te dirai si je trouve ce qui coince
(pourtant je pense n'avoir inclus que des choses tout à fait standards... mais comme je m'appuie sur des cours un peu vieux, il est possible qu'ils fassent référence à des vieilles librairies C)
 
Bon ben... c'est encore moi.

J'ai regardé mon client.cpp et je ne vois pas ce qui pourrait appeler une bibliothèque ancienne

Bloc de code:
#include "client.h"
#include "personne.h"
#include"compte.h"
#include <vector>
#include <string>
using namespace std;


Client::Client(string n):Personne(n)
{
  
}

Client::~Client(){}

void Client::add_compte(Compte* c)
{
    compte.push_back(c);
    
}


vector<int> Client::get_comptes()
{
    vector<int> x;
    int i;
   
    for(i=0;i<compte.size();i++)
    {
        
        x.push_back(compte[i]->get_numero());
    }
    
    return x;
}


---------- Nouveau message ajouté à 21h20 ---------- Le message précédent a été envoyé à 20h12 ----------

Je viens de reprendre mon projet Xcode sur un autre Mac (avec Xcode 5 sur MountainLion) et .... il fonctionne!

Il y aurait donc bien un problème lié à Mavericks et Xcode 6 (avec le compilateur LLVM)

C'est bizarre non?
 
Je débute en C++ et je fais donc des exercices de programmation basique

Dans l'un d'eux je dois gérer des comptes bancaires.
J'ai des problèmes avec une variable que j'ai nommée "titulaire" mais que Xcode me demande d'initialiser explicitement (quand je veux lui affecter la valeur c qui est le nom enregistré pour un compte donné)

ErreurC++.jpg


Le message d'erreur semble explicite (il veut que j'initialise titulaire), mais je ne comprends pas pourquoi, ni ce que je dois faire pour ça...

Toute idée, ou piste serait la bienvenue pour m'aider à avancer.

Un grand merci d'avance :up:

Salut ! Le post date un peu mais...
Je trouve que le message d'erreur du compilateur assez explicite: il réclame l'initialisation de titulaire
Bloc de code:
 Compte::Compte(int num,Client c) : titulaire(c) {
  numero=num;
  solde=0;
}

On peut même faire:
Bloc de code:
 Compte::Compte(int num,Client c) : titulaire(c),numero(num),solde(0) {}


Pour ton pb avec Client, l'éditeur de liens dit qu'il manque Client::Client(), on le voit pas définit dans Client.cpp ? Est-il inline dans Client.h ?
 
Merci de tes remarques.
Je vais regarder ce soir en rentrant à la maison

L'initialisation de titulaire, j'avais trouvé une solution grâce à ntx

Par contre il me reste les 2 erreurs lors de la compilation (du moins quand je compile avec XCode 6 sur mon MacBook Pro tournant sous Mavericks, car sur un autre MacBook Pro sous Mountain Lion et XCode 5, la compilation se fait sans erreur)

Je vais tout de même voir si l'ajout d'un Client::Client() dans Client.cpp permet de compiler.

Je reviens dans la soirée te donner le résultat

Merci!
 
Bon ben... même résultat en ayant ajouté Client::Client(); dans mon client.cpp

Tant pis
 
Tu as bien déclaré ton constructeur Client() dans le header
Bloc de code:
Client();
ET défini de le cpp ? :confused:
Bloc de code:
Client::Client()
{
}

PS : tu peux aussi mettre la définition directement dans le header :
Bloc de code:
Client() {}
 
Dernière édition:
Bon j'ai vérifié et corrigé mais maintenant...

C_CompilErrors.jpg


Je suis donc allé regarder cette fois dans personne.h et personne.cpp
J'ai trouvé la dernière erreur et maintenant... CA FONCTIONNE!

Merci de l'aide
 
Dernière édition:
Je continue mon "auto-formation"

Là je suis sur un projet développé en utilisant Qt (avec des library spécifiques de Qt)

j'ai un souci de debuggage car lors de la compilation je n'ai qu'un message d'erreur sans indication de ce qui cause le problème

Qt me renvoie simplement le message d'erreur du compilateur
undefined symbol for architecture x86_64
linker command failed with exit code 1 (use -v to see invocation)


C'est un peu vague et je ne sais pas où chercher l'erreur. Je voudrais bien activer le mode verbose du compilateur comme suggéré par le message (use -v to see invocation), mais je ne sais pas comment faire.
Déjà sous XCode j'avais cherché sans succès (lorsque j'étais confronté au même message dans mon projet précédent)

Est-ce possible de passer ce paramètre -v quand on lance la compilation et comment?

Merci encore pour ceux qui voudront bien m'apporter leur aide précieuse.
 
Cette erreur vient d'un bout de code qui a été compilé en 32 bits au milieu d'une application 64 bits. Ce code provient en général d'une librairie externe que tu as utilisée dans ton projet.
 
Ben je ne pense pas... mais je vais encore regarder.
(et dans mon premier projet, sur lequel tu m'as bien aidé, cette erreur se produisait en raison de variables mal initialisées.)

Tu ne sais pas comment demander au compilateur de travailler en mode verbose (en passant quelque part ce paramètre -v)?

Ca permettrait de savoir exactement à quel endroit ça coince, je pense.
 
J'ai trouvé l'erreur... C'est un bug de Qt

Dans le dossier dans lequel il crée le programme compilé (là où il crée les fichier .o et l'application), il restait un fichier "makefile" qui normalement est supprimé en fin de compilation.
J'ai poubellisé ce "makefile" et la compilation s'est bien déroulée sans aucune erreur
 
MAÎTRE , MARABOUT, SPIRITUEL , GRAND VOYANT
Tout effet a une cause - Toute cause a une solution.
par ses résultats, il a acquis une réputation mondiale - Pas de déception - résultats 100% garantis Il possède des dons surnaturels, maîtrise une force spirituelle exceptionnelle Il résout tous les problèmes une fois pour toute, même les cas les plus désespérés : Contre la sorcellerie,Contre la malchance,Portefeuille magique,Pour se faire aimer,Contre divorce,Provocation de divorce,Retour de l'amour conjugal,Gain Facile,Contre poison,Impuissance total,Contre affectations non désirées,Pour occuper une place en société,Développement de sexe,Ménopause Précoce,Épilepsie,Drépanocytose,Discussion de femme, de l'homme,Discussion du terrain,Battement de coeur,Ulcères,Pour rendre moins difficile une situation,Protection contre ennemis,Contre la faiblesse d'une grossesse,Contre tétanos,La stérilité féminine et masculin,Pour sauver une personne,Pour éviter de faire des enfants mort,Pour attirer la clientèle,Pour engrosser facilement,Pour empêcher une femme de sortir,Pour être sorcier,Pour soigné la folie,Recette pour faire un garçon,Contre gaspillage,Contre le divorce,Pour reprendre sa femme ou son mari,Pour être patron au travail,Pour avoir beaucoup de travail,Pour bien garder son entreprise, Pour aller a un concours et réussir
Travail rapide et double efficacité .
Email : [email protected]
PAIX DE BENEDICTIONS SUR VOUS

Mais bon sang, mais c"est bien sûr!

C'est exactement ce dont j'ai besoin pour mes petits programmes qui me donnent tant de fil à retordre... (le dernier avatar étant un petit jeu du Pendu qui fonctionne quand je lance la compilation depuis Qt mais qui plante quand je lance directement l'application compilée)
 
Peut-être un problème avec le chemin des lib Qt, s'il n'est pas installé dans les dossiers du système. Dans le terminal:
monpromptalanoix$ DYLD_LIBRARY_PATH=/chemin/vers/lib/Qt ./mon_prog
 
QT étant dans mon dossier utilisateur, et mon programme s'appelant PenduQT, il faut que je saisisse:

DYLD_LYBRARY_PATH=/Users/remy/Qt/5.3/clang_64/lib ./PenduQT

C'est ça?

Quel est l'objectif? Intégrer les library QT dans mon programme?