IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Ne compile pas


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    925
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 925
    Par défaut Ne compile pas
    Bonjour,
    Je veux utiliser Class1 dans Class2 et ca ne compile pas.

    Merci de me dépanner .
    Fichiers attachés Fichiers attachés

  2. #2
    Membre confirmé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Février 2015
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Février 2015
    Messages : 66
    Par défaut
    Je ne vois pas de "Class1" dans tes fichiers de solution.

    Sinon, l'héritage en C++ te sauvera.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Class2 : public Class1
    {
        public:
            void maMethode() const;
     
            etc..
    };
    Dans ce bout de script, la "Class2" hérite de la "Class1" et donc de toutes les fonctions qui lui sont rattachées.

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    925
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 925
    Par défaut
    La classe "Class1" est définit dans le fichier cdx.h joint dans le zip.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    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++

    Cela ne va pas faciltier les choses
    Sinon, l'héritage en C++ te sauvera.
    NOOONNNN!!!!

    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 )

    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 de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace cdx {
            public: class Class1;
    	ref class Class2
    	{
    	    public:void a();
                private: Class1 ^ c1:
    	};
    }
    A 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.

    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

    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é Le C++ "pur" ne te permettra-t-il pas de faire ce que tu souhaite
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    925
    Détails du profil
    Informations personnelles :
    Localisation : France, Vienne (Poitou Charente)

    Informations forums :
    Inscription : Mai 2011
    Messages : 925
    Par défaut
    J'ai résolu le probléme mais ce n'est pas propre d'inclure de(s) fichiers .h dans un fichier .h .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
    	};
    }
    C'etait un projet d"essaie pour isoler le bug.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par yann458 Voir le message
    ce n'est pas propre d'inclure de(s) fichiers .h dans un fichier .h .
    Gné ?
    Les includes ça se gère pas au petit bonheur. Un header peut avoir besoin d'autres headers et doit donc les inclure.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par yann458 Voir le message
    J'ai résolu le probléme mais ce n'est pas propre d'inclure de(s) fichiers .h dans un fichier .h .
    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
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 06/03/2006, 10h15
  2. compile pas
    Par Bibouda dans le forum C
    Réponses: 7
    Dernier message: 08/11/2005, 17h02
  3. [WTK] HelloWorld qui compile pas
    Par metos256 dans le forum Java ME
    Réponses: 2
    Dernier message: 08/09/2005, 12h35
  4. [Delphi 2005] Librairie Word (Word_TLB) ne compile pas
    Par Brogomil dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 01/08/2005, 10h12
  5. Réponses: 5
    Dernier message: 01/08/2004, 01h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo