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 :

Inclusion ne marche pas ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 46
    Par défaut Inclusion ne marche pas ?
    Bonjour a tous !

    Je suis actuellement en train de developper un gros outil dont une partie m'echape.

    J'ai deux classes: CString et CInteger.

    Chacune inclus l'autre avec les #ifndef ... tout est ok ça compile, c'est très simple

    La je veux convertir une classe en une autre ...

    Je commence dans la classe CString

    Je fais une fonction :

    CInteger size(); //pour retourner la taille de ma chaine.

    et la le bougre de compilo me dis
    'CInteger' does not name a type

    Quelqu'un aurait une idée ?

    D'avance merci

    Si besoin je peux envoyer mon source

  2. #2
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Bonjour,
    Citation Envoyé par loman02 Voir le message
    Chacune inclus l'autre avec les #ifndef ... tout est ok ça compile, c'est très simple
    Justement ce n'est pas "ok", voila une solution pour éviter les inclusions croisée :
    MaClasse1.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifndef MA_CLASSE_1
    #define MA_CLASSE_1
     
    class MaClasse2;   // il faut peut-être rajouter le mot clé "extern" sur certains compilateurs il me semble (en tout cas à partir de visual 2005 pas de souci)
     
    class MaClasse1
    {
    MaClasse2 function();
    //...
    }
    MaClasse1.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "MaClasse1.h"
    #include "MaClasse2.h"
     
    MaClasse2 MaClasse1::function()
    {
    //...
    }
    Le code devrait maintenant compiler mais tu peux également utiliser le même procédé pour MaClasse2.h(/.cpp). Ce système a l'avantage de résoudre un certain nombre d'inclusions croisées (pas tous il me semble) tout en accélérant le temps de compilation (visible sur des projets comprenant plus de 4fichiers bien sur ) étant donné qu'il réduit les dépendances d'un header.

    edit : La FAQ en parle

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par babar63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class MaClasse2;   // il faut peut-être rajouter le mot clé "extern" sur certains compilateurs il me semble (en tout cas à partir de visual 2005 pas de souci)
    Non, il ne faut pas.

    extern s'applique à une déclaration de variable ou de fonction, et garanti que la déclaration a une liaison externe (external linkage).

    Sur un type cela n'a pas de sens, parce qu'une déclaration de classe a toujours une liaison externe, et un typedef n'a jamais de liaison (no linkage).

  4. #4
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Citation Envoyé par corrector
    Non, il ne faut pas.

    extern s'applique à une déclaration de variable ou de fonction, et garanti que la déclaration a une liaison externe (external linkage).

    Sur un type cela n'a pas de sens, parce qu'une déclaration de classe a toujours une liaison externe, et un typedef n'a jamais de liaison (no linkage)
    J'ai du confondre avec un autre topic sur le sujet (), aussi c'est vrai que j'ai toujours était faché avec ce mot clé mais c'est retenu merci bien pour la précision

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 46
    Par défaut
    Je te remercie de cette réponse rapide et qui fonctionne

  6. #6
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Attention cependant, comme le précise la faq cette technique ne marche pas dans tout les cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef MA_CLASSE_1
    #define MA_CLASSE_1
     
    class MaClasse2;
     
    class MaClasse1
    {
    MaClasse2 function();    // Ok
    //...
    protected:
    MaClasse2 *attribPtr;    // Ok, le compilateur n'a pas à connaitre la définition de MaClasse2
    MaClasse2 &attribRef;    // Ok
    MaClasse2 attrib;        // Erreur de compilation
    };
    Il me semble (mais c'est à vérifier...) qu'il est possible de gérer ce problème dans le cas ou MaClasse1 contient une donnée membre de type MaClasse2 et MaClasse2 contient une donnée membre de type MaClasse1 en passant par un troisième header se chargeant des includes... mais encore une fois je n'ai jamais eu à essayer donc à voire

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut X appartient à Y appartient à X
    Citation Envoyé par babar63 Voir le message
    le cas ou MaClasse1 contient une donnée membre de type MaClasse2 et MaClasse2 contient une donnée membre de type MaClasse1
    Intéressant.

    Quel est sizeof (MaClasse1)? sizeof (MaClasse2)?

    Comment construire une instance de MaClasse1? Combien de temps ça prend?

  8. #8
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Citation Envoyé par corrector
    Intéressant.

    Quel est sizeof (MaClasse1)? sizeof (MaClasse2)?

    Comment construire une instance de MaClasse1? Combien de temps ça prend?
    Je ne sais pas, je dirai que le calcul du déterminant empirique de la sinusoïdale abstraite au carré, mutliplié par une petite série de taylor devrait donner une bonne approximation de la taille... mais je vais pas me lancer dans les maths...

    Bon d'accord j'en ai dit une...

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

Discussions similaires

  1. Débogage DLL (avec pdb inclus) en mode pas à pas ne marche pas
    Par Plageman dans le forum Général Dotnet
    Réponses: 7
    Dernier message: 28/11/2008, 19h40
  2. 'SHOW TABLES' marche pas sous postgresql !?
    Par fet dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 13/05/2004, 09h28
  3. Réponses: 9
    Dernier message: 07/05/2003, 12h57
  4. [GifDecoder] marche pas dans applet avec IE
    Par formentor dans le forum Applets
    Réponses: 2
    Dernier message: 06/05/2003, 10h43
  5. Sysdate qui marche pas ??
    Par StouffR dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/08/2002, 13h23

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