2010-09-14 6 views
1

Bonjour, j'ai des structures déclarées dans le même fichier d'en-tête qui ont besoin l'une de l'autre.Structures C++ Interdépendance

struct A; // ignored by the compiler 
struct B{ 
    A _iNeedA; //Compiler error Here 
}; 

struct A { 
    B _iNeedB; 
}; 

ce travail normalement

class A; 
class B{ 
    A _iNeedA; 
}; 

class A { 
    B _iNeedB; 
    }; 

// everything is good 

Merci beaucoup!

+0

Juste pour clarifier, Lorsque vous utilisez des classes cela fonctionne, quand vous utilisez des structs ce n'est pas le cas? Si oui, quel compilateur utilisez-vous? –

+0

Cela ne peut pas fonctionner même si vous remplacez le mot-clé struct par class. Les deux sont la même chose en C++ de toute façon. À part ça, j'irais avec la réponse de Rudolph, sauf que vous pouvez aussi utiliser des références. –

+0

vous avez tous les deux raison ... – MiniScalope

Répondre

0

Je réponds à ma propre question. Le fait est que ce que je fais n'est pas exactement ce que j'ai posté mais je pensais que c'était la même chose, en fait, j'utilise des opérateurs qui prennent des arguments. Ce corps d'opérateurs doit être défini après mes constructions ( ) car la structure B ne connaît pas encore les membres de la structure A ...

J'ai dit que ça fonctionnait avec les classes car avec les classes on utilise habituellement le fichier CPP pour la définition des méthodes, ici je ne suis pas en utilisant un fichier cpp pour les méthodes j'utiliser dans mon struct

J'étais sur le point de supprimer ce message mais vous les gars trop vite;),

Voici un exemple

struct A; 

struct B { 
int member; 
bool operator<(const A& right); //body not defined 

}; 

struct A { 

int member; 
    bool operator<(const B& right) 
    { 
     return this->member < B.member; 
    } 
}; 

bool B::operator<(const A& right) //define the body here after struct A definition 
{ 
    return this->member < A.member; 
} 
7

Cela ne peut pas fonctionner: A contient B contient A contient B contient .... Où s'arrêter?

Tout ce que vous pouvez faire pour modéliser les dépendances cycliques est pointeurs utilisation:

class A; 

class B { 
    A* _iNeedA; 
}; 

class A { 
    B* _iNeedB; 
}; 

Maintenant, les classes ne contiennent pas, que des indications sur l'autre.

De plus, vous devez faire attention que vous ne pouvez pas utiliser les choses que vous ne l'avez pas encore définies: dans le code ci-dessus, vous avez déclaré A avant de définir B. Il est donc bon de déclarer les pointeurs à A dans B. Mais vous ne pouvez pas encore utiliserA avant de le définir.