2009-03-24 5 views
5

Supposons que je veux quelque chose de ce genre, dans un seul fichier source .cpp:C++ - 2 classes 1 fichier

class A { 
    public: 
     void doSomething(B *b) {}; 
}; 

class B { 
    public: 
     void doSomething(A *a) {}; 
}; 

Y at-il de toute façon de faire cela sans le diviser en deux fichiers séparés, et sans recevoir une erreur du compilateur (erreur de syntaxe sur doSomething(B *b))

+0

Me, évidemment :-) Ou selon votre réponse comme le plus. –

+0

@ Yuval, acceptez la personne qui a été la première à répondre à votre question. –

+0

@Yuval - Acceptez la première réponse qui a répondu correctement et utilement à votre question. –

Répondre

22

de mettre à la première ligne:

class B; 
+0

Vous étiez d'abord, merci! :) –

4

avant de déclarer une classe devant les autres avec

class B; 
or 
class A; 

Mais encore vous ne serez pas en mesure de mettre en œuvre

void doSomething(B *b) 

en utilisant uniquement la déclaration avant de B. Vous devez mettre définition doSomething ci-dessous classe complète Une déclaration

12

Si je me souviens Eh bien, vous pouvez «pré-déclarer votre classe B.

class B; // predeclaration of class B 

class A 
{ 
    public: 
     void doSomething(B* b); 
} 

class B 
{ 
    public 
     void doSomething(A* a) {} 
} 

public void A::doSomething(B* b) {} 

Ensuite, votre classe 'a' sait qu'une classe 'B' Exis ts, bien qu'il n'ait pas encore été défini.

La déclaration directe est en effet le bon terme, comme évoqué par Evan Teran dans les commentaires.

+1

bonne réponse, donc vous obtenez le +1.Mais pour référence, le terme est "déclaration avant" –

3

Oui. Vous avez besoin d'une déclaration avant:

class B; // add this line before A's declaration 

class A { 
    public: 
     void doSomething(B *b) {}; 
}; 

class B { 
    public: 
     void doSomething(A *a) {}; 
}; 
1

Vous pouvez essayer une déclaration en avant comme

class B; 
class A { 
    void Method(B*); 
}; 
class B{ 
}; 

mais vous ne serez en mesure de déclarer des variables de pointeur et de référence B alors. Si vous en voulez plus (comme une méthode qui déréférence la variable B *) vous pouvez fournir une déclaration seulement et définir des méthodes plus tard dans le même fichier - au point où la déclaration des deux classes est déjà disponible.

1

Vous devez envoyer déclarer B.

class B; 

class A 
{ 
public:   
    void doSomething(B *b) {} 
}; 

class B 
{  
public:   
    void doSomething(A *a) {} 
}; 

(Et BTW, vous n'avez pas besoin les points-virgules après la fonction membre accolades. :))

3

The C++ FAQ Lite répond à cette question et autres. J'envisagerais sérieusement de lire cette chose de bout en bout, ou d'obtenir le livre et de faire la même chose.

+1

+1 pour dire quelque chose de différent que le groupe –

0

Ajouter une autre déclaration de B avant A:

class B; 

class A { 
    public: 
     void doSomething(B *b) {}; 
}; 

class B { 
    public: 
     void doSomething(A *a) {}; 
}; 
Questions connexes