2016-05-30 1 views
0

Donc, j'ai 2 classes appelons-la classe A et B qui à l'intérieur de ces classes ont une référence les uns pour les autres comme arguments d'une fonction. Lorsque je tente de transmettre le déclarer comme ceci:Transférer les classes déclarées, redéfinition de la classe

// A.h (Header guarded) 
namespace ns { 
    class B { // Attempt to forward declare B 
    public: 
     int getRand(); 
    }; 

    class A { 
    public: 
     float a, b; 

     void aFunc(B &b);  
    }; 
} 

// B.h (Header guarded) 
namespace ns { 
    class A { // Attempt to forward declare A 
    public: 
     float a, b; 
    }; 

    class B { 
    public: 
     void bFunc(A &a); 
     int getRand(); 
    }; 
} 

La chose est, quand je fais cela, je suis 'class' type redefinition erreur. J'ai cherché la solution et je n'ai toujours pas trouvé de solution. Est-ce que je fais ça bien? Ce que je suppose que je ne suis pas, pouvez-vous me dire où j'ai fait mal ici?

+2

Ce n'est pas une déclaration avant que vous avez là! 'la classe B;' serait. – jrok

+0

@jrok hmm, mais que se passe-t-il si j'ai besoin d'accéder aux variables de B à partir de A? Sans cela, il génèrerait une erreur qui est '' type incomplet non autorisé'' – Greffin28

+0

Cela dépend des classes. Dites-nous en plus sur eux et que voulez-vous accomplir. – jrok

Répondre

2

Ils ne sont pas la déclaration avant, ils sont définitivement définis.

Vous devez

// A.h (Header guarded) 
namespace ns { 
    class B; // forward declare B 

    class A { 
    public: 
     // Some functions with B references as arguments   
    }; 
} 

Et il est même pour B.h. Selon votre situation, il existe seulement certaines fonctions membres qui prennent en compte la classe déclarée en tant que paramètres, vous pouvez laisser la déclaration des fonctions membres dans le fichier .h et fournir leur définition dans le fichier .cpp. Tels que

// A.h (Header guarded) 
namespace ns { 
    class B; // forward declare B 
    class A { 
    public: 
     float a, b; 
     void aFunc(B &b);  
    }; 
} 

// B.h (Header guarded) 
namespace ns { 
    class A; // forward declare A 
    class B { 
    public: 
     void bFunc(A &a); 
     int getRand(); 
    }; 
} 

// A.cpp 
#include "A.h" 
#include "B.h" 
namespace ns { 
    void A::aFunc(B& b) { /* ... */ } 
} 

// B.cpp 
#include "A.h" 
#include "B.h" 
namespace ns { 
    void B::bFunc(A& b) { /* ... */ } 
    int B::getRand() { /* ... */ } 
} 
+0

Que faire si j'ai besoin d'accéder aux variables de B à partir de A? Sans cela, une erreur "type incomplet non autorisé" serait générée. – Greffin28

+0

@ Greffin28 - Veuillez relire la conception orientée objet et l'encapsulation –

+0

@ Greffin28 S'il n'y a que quelques fonctions membres qui prennent en compte la classe déclarée en tant que paramètres, vous pouvez simplement laisser la déclaration des fonctions membres dans le fichier .h et fournir leur définition dans le fichier .cpp. – songyuanyao