Bonjour,
Je veux utiliser Class1 dans Class2 et ca ne compile pas.
Merci de me dépanner .
Version imprimable
Bonjour,
Je veux utiliser Class1 dans Class2 et ca ne compile pas.
Merci de me dépanner .
Je ne vois pas de "Class1" dans tes fichiers de solution.
Sinon, l'héritage en C++ te sauvera.
Dans ce bout de script, la "Class2" hérite de la "Class1" et donc de toutes les fonctions qui lui sont rattachées.Code:
1
2
3
4
5
6
7 class Class2 : public Class1 { public: void maMethode() const; etc.. };
La classe "Class1" est définit dans le fichier cdx.h joint dans le zip.
Salut,
Le fait est que ce projet n'est pas du C++ "pur", mais du C++ managé, à la sauce de microsoft, qui se rapproche beaucoup plus du C# ou de .Net que du C++ 8O
Cela ne va pas faciltier les choses :ouin:
NOOONNNN!!!!Citation:
Sinon, l'héritage en C++ te sauvera.
L'héritage est la relation la plus forte qui puisse exister entre deux classes, parce qu'elle correspond à une relation "est un" / "peut être utilisé comme étant un" / "est substituable à un".
Le code de Classe2::a() essaye de créer une instance de Classe1, qui est, effectivement, définie dans le fichier cdx.h (mais dont on se demande à quoi elle peut servir, parce que, pour être honnête, une classe sans aucune fonction ni aucune donnée, c'est pour le moins suspect :aie: )
En C++, on pourrait déclarer le pointeur c1 (nota : le code cdx::Class1 ^ cl = gcnew cdx::Class1(); défini c1 comme étant un pointeur managé sur une instance de Class1) à condition que le compilateur sache que la classe Class1 existe au moment de traiter le fichier Class2.h, par exemple, sous la forme d'une déclaration anticipée.
Comme Class1 et Class2 font partie du même espace de nommage, nous pourrions par exemple avoir, dans class2.h, un code proche deA ceci près que, dans le code qui est fourni, on va essayer de créer une instance de Class1 (au travers de gcnew cdx::Class1();, qui correspond à l'appel à un mécanisme équivalent à new, mais sous une forme managée), et donc, que le simple fait de savoir que la classe existe ne suffit plus, parce que le compilateur va avoir besoin connaitre ... l'ensemble de ce qui compose la Class1.Code:
1
2
3
4
5
6
7
8 namespace cdx { public: class Class1; ref class Class2 { public:void a(); private: Class1 ^ c1: }; }
Le seul moyen pour que ce code puisse fonctionner est donc ... d'inclure le fichier Class1.h dans le fichier Class2.h.
Enfin, le projet semble avoir été développé (même s'il s'agit tout petit essais) à la base sous VisualStudio 2010, et, pour une raison "à déterminer", la conversion vers VisualStudio 2019, ne serait-ce que parce qu'il ne retrouve pas le fichier cdx.h lorsqu'on essaye de l'inclure dans Classe2.h :aie:
Ce n'est surement rien de très compliqué à résoudre, mais là, je n'ai pas vraiment le temps d'y regarder ;)
Enfin, il reste malgré tout une question importante à poser: pourquoi veux tu travailler en C++ managé :question: Le C++ "pur" ne te permettra-t-il pas de faire ce que tu souhaite :question:
J'ai résolu le probléme mais ce n'est pas propre d'inclure de(s) fichiers .h dans un fichier .h .
C'etait un projet d"essaie pour isoler le bug.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 #include "cdx.h" namespace cdx { public ref class Class2 { public:void a() { cdx::Class1 ^ cl = gcnew cdx::Class1(); } public: int b(); }; }
Non, c'est d'inclure un fichier d'implémentation (*.cpp) dans un fichier d'en-tête qui n'est "pas propre".
On aime autant, si possible, éviter d'inclure les fichiers "non inutiles" dans les fichiers d'en-tête, par exemple lorsque le compilateur peut se contenter -- au niveau d'un fichier d'en-tête -- de savoir qu'un type existe, parce que ce type n'est utilisé (dans le fichier d'en-tête, toujours) que sous forme de pointeur ou de référence.
Mais dés que le compilateur a besoin de connaitre l'intégralité de ce qui compose un type (par exemple, parce que l'on a une donnée ou un type de retour qui prend la forme d'une valeur), on n'a pas vraiment d'autre choix que d'inclure le fichier d'en-tête qui défini le type en question ;)
C'est parce que la fonction maMethode du code que tu présente est définies (sous une forme explicitement inline dans le cas présent) au niveau du fichier d'en-tête lui-même que tu n'auras absolument pas le choix: pour pouvoir créer l'instance pointée par c1, le compilateur devra ... savoir tout ce qui compose la classe Class1; et il devra le faire au niveau du fichier d'en-tête :)
Par contre, si tu décidais de séparer l'implémentation de la fonction et de la mettre dans un fichier d'implémentation (*.cpp), le compilateur n'aurait même pas besoin de savoir que Class1 existe au niveau du fichier d'en-tête de Class2, et l'inclusion de cdx.h pourrait n'arriver qu'au niveau ... de Class2.cpp :D