2016-03-12 1 views
0

J'ai affaire à une situation où j'essaie de définir deux classes qui dépendent l'une de l'autre. Ceci est un exemple simplifié de ce que j'essaie de faire.Déclaration et classes de renvoi

class a{ 
public: 
    int ia; 
    int printb(b in){ 
     return in.ib; 
    } 
}; 

class b{ 
public: 
    int ib; 
    int printb(a in){ 
     return in.ia; 
    } 
}; 

Ceci me donne des erreurs de classe b non définies. J'ai essayé

class b; 

class a{ 
public: 
    int ia; 
    int printb(b in){ 
     return in.ib; 
    } 
}; 

class b{ 
public: 
    int ib; 
    int printb(a in){ 
     return in.ia; 
    } 
}; 

Mais cela ne résout pas le problème. Des idées?

+1

Pensez-y: Comment est le compilateur censé savoir ce 'in.ib de retour,' signifie sans connaître la définition de 'b'? Vous devez définir 'b' avant de définir' a :: printb'. –

+0

Alors déclarez seulement les sous-routines dans les classes et définissez-les plus tard? – WhatWouldKantDo

+0

Oui. Il y a probablement une dupe pour ça, mais je ne sais pas comment chercher ça non plus. :/ –

Répondre

3

Tout ce que vous avez à faire est de garder l'implémentation des fonctions membres en dehors de la définition de la classe. Vous pouvez ensuite faire en sorte que les deux classes sont définies avant la mise en œuvre des membres:

class b; 

class a{ 
public: 
    int printb(b in); 
    int ia; 
}; 

class b{ 
public: 
    int ib; 
    int printb(a in); 
}; 

int a::printb(b in){ 
     return in.ib; 
    } 
int b::printb(a in){ 
     return in.ia; 
    } 
+0

Les deux fonctions membres doivent probablement être marquées 'inline' pour être cohérentes avec le code original. Également nécessaire s'il s'agit en fait d'un fichier d'en-tête. –