salut
en fait mon programme consiste à créer une classe A et deux autres B et C qui héritent de A et je veux faire une méthode dans B qui a pour argument un objet de C. si quelqu'un peut m'aider ?
salut
en fait mon programme consiste à créer une classe A et deux autres B et C qui héritent de A et je veux faire une méthode dans B qui a pour argument un objet de C. si quelqu'un peut m'aider ?
Dans B.h j'imagine que tu inclus A.h
Ajouteau dessus de la def de ta classe B
Code : Sélectionner tout - Visualiser dans une fenêtre à part class C;
Tu pourras ainsi déclarer, dans ta classe B, des méthodes prennant une référence ou un pointeur vers un objet C, du style :Ensuite, dans B.cpp tu inclus C.h, et tu écris la définition de ta méthode.
Code : Sélectionner tout - Visualiser dans une fenêtre à part void DoSmthg( const C & c );
Mais tout ça doit-être plus ou moins expliqué dans la faq C++
tout d'abord merci pour la réponse
mais le vrai problème c'est qu'il ya une autre classe D qui hérite de A et je veux créer une méthode dans B qui a pour argument un objet de D sachant que tout le programme est écrit dans un seul fichier il me donne l'erreur suivant:
In member function ‘void B::fct( class D&)
invalid use of undefined type ‘struct D’
forward declaration of ‘struct D’
Ah! Les joie des forums, avec ses utilisateurs qui pensent sincèrement qu'ils sont en droit d'avoir une réponse après avoir posé une question, sans se dire ne serait-ce qu'une seconde que les gens qui répondent le font par passion, et pas parce qu'ils y sont obligés.
Ton problème est résolu par l'utilisation de foward references - une pré-déclaration. Pour pré-déclarer une classe, on utilise la syntaxe
class NOM_DE_LA_CLASSE;
Pour pré-déclarer une structure, on utilise
struct NON_DE_LA_STRUCT;
La pré-déclaration permet de dire au compilateur que la classe ou la structure existe, mais ne dis pas au compilateur ce qu'elle contient. Tant qu'elle n'est pas définie, il s'agit de ce qu'on appelle un type incomplet.
Prenons un exemple : ma classe A se sert de B, et B ne peut pas être défini avant A :
Ce code génère une erreur parce que B n'est pas déclaré au moment ou la classe est utlisée dans A. Pour résoudre le problème, on pré-déclare B:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 class A { public: void func(B* b); }; class B : public A { };
Prenons un autre exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 class B; class A { public: void func(B* b); }; class B : public A { };
Ce code ne compilera pas, malgré la pré-déclaration, car l'utilisation de B dans la classe A nécessite une connaissance complète de B - hors seul un type incomplet est connu du compilateur au moment de la compilation de la classe A.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 struct B; class A { public: void func(B b) { ... } }; struct B : public A { };
Encore une exemple:
L'appel à doSomething provoque une erreur au moment de la compilation car le compilateur ne sait pas encore que cette méthode est définie dans la classe B.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 class B; class A { public: void func(B* b) { b->doSomething(); } }; class B : public A { public: void doSomething(); };
Pour corriger le problème, il faut laisser la déclaration de func() dans la classe A mais déplacer sa définition après la définition de la classe B :
La règle de base est la suivante : le modèle de compilation C++ étant séquentiel, on ne peut utiliser que des informations qui ont été déclarées ou définie avant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 class B; class A { public: void func(B* b); }; class B : public A { public: void doSomething(); }; void A::func(B* b) { b->doSomething(); }
Quelle chance que je ne me fasse pas payer pour répondre à des questions sur un forum!
Merci pour cette claire réponse, ça marche, dont on procède de la même manière comme si on veut créer des fonctions en C, j’avoue que ça m’a échappé mais tant qu’on vit on apprend
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager