2017-10-13 4 views
0

Puis-je transmettre une variable de classe de déclaration dans une autre classe pour éviter une dépendance circulaire et si oui, comment? Exemple:Transférer la déclaration de la variable de classe

//another file 
class Engine; 
extern vector<Block*> Engine::MapBlocks; 

//Engine.h 
class Engine 
{ 
public: 
    vector<Block*> MapBlocks; 
}; 

Il est possible?

+1

Non ne fonctionnera pas – CoryKramer

+0

C++ n'a pas de classes partielles. – Ron

Répondre

0

Non, ce que vous essayez de faire n'est pas possible. Il n'est pas possible de déclarer des membres de classe non statiques en dehors de la définition de classe. Si une telle chose était autorisée, cela permettrait à n'importe quel code de modifier arbitrairement n'importe quelle classe (par exemple en déclarant un membre qui ne fait pas partie de la classe). Logiquement, cela rompt complètement l'intention d'utiliser des classes (par exemple l'encapsulation).

Cependant, il est possible de passer et de stocker des pointeurs vers un type de classe, sans que la définition soit visible. Dans ce cas

#include <vector>  // necessary for use of std::vector 

class Block; 

class Engine 
{ 
    public: 
    std::vector<Block*> MapBlocks; 

     // preferably declare constructors and/or other member functions 
     // that initialise MapBlocks appropriately to needs 
}; 

Cela fonctionne parce que le compilateur n'a pas besoin d'avoir une visibilité de la définition de Block pour stocker des pointeurs dans un récipient.

Naturellement, tout code qui tente d'instancier un Block (par exemple some_engine.MapBlocks.push_back(new Block)) ou appeler ses fonctions membres (par exemple some_engine.MapBlocks[some_valid_index]->some_member_function()) repose sur la visibilité d'une définition de classe Block, pas seulement une déclaration en avant.

3

Pas

Votre déclaration de classe doit être complète, vous ne pouvez pas diviser ou déclarer partiellement.

Si vous avez posé une question sur le vrai problème que vous avez rencontré, nous pourrions peut-être vous aider de toute façon. Très probablement, il y a une solution, mais pas à cette question abstraite.