2009-11-12 16 views
0

considèrent cette classe:C++ classe virtuelle, sous-classe et autoréférence

class baseController { 

    /* Action handler array*/ 

std::unordered_map<unsigned int, baseController*> actionControllers; 

protected: 

    /** 
    * Initialization. Can be optionally implemented. 
    */ 
    virtual void init() { 

    } 

    /** 
    * This must be implemented by subclasses in order to implement their action 
    * management 
    */ 
    virtual void handleAction(ACTION action, baseController *source) = 0; 

    /** 
    * Adds an action controller for an action. The actions specified in the 
    * action array won't be passed to handleAction. If a controller is already 
    * present for a certain action, it will be replaced. 
    */ 
    void attachActionController(unsigned int *actionArr, int len, 
      baseController *controller); 

    /** 
    * 
    * checks if any controller is attached to an action 
    * 
    */ 
    bool checkIfActionIsHandled(unsigned int action); 

    /** 
    * 
    * removes actions from the action-controller filter. 
    * returns false if the action was not in the filter. 
    * Controllers are not destoyed. 
    */ 
    bool removeActionFromHandler(unsigned int action); 

public: 

    baseController(); 

    void doAction(ACTION action, baseController *source); 

}; 

} 

et cette sous-classe

class testController : public baseController{ 

    testController tc; 

protected: 

    void init(){ 
     cout << "init of test"; 
    } 



    void handleAction(ACTION action, baseController *source){ 

     cout << "nothing\n"; 

    } 

}; 

Le compilateur est avec une erreur sur la sous-classe sur le membre

testController tc; 

..indiquer

error: field ‘tc’ has incomplete type 

mais si j'enlève ça et que j'instance la classe ça marche ... y a-t-il un moyen d'éviter cette erreur ??? Cela me semble si étrange ...

Répondre

4

Votre code tente d'incorporer une instance entière de testController à l'intérieur de lui-même, ce qui est impossible. , Vous voulez plutôt une référence:

testController &tc; 

ou un pointeur

testController *tc; 
+2

Vous avez mentionné dans une autre question que vous êtes familier avec Java, mais à nouveau C++. Une différence importante est la signification d'une déclaration d'une variable de classe, telle que 'Objet de classe;'. En C++, cette variable est une instance de 'Class', plutôt qu'une référence comme Java. –

0

Il ne compilera pas parce que vous déclarez une variable membre 'tc' qui est une instance de lui-même. Vous n'utilisez pas tc dans la sous-classe; Quelle est votre intention ici?

0

Vous ne pouvez pas créer un objet de la classe à l'intérieur de cette classe elle-même. Probablement ce que vous avez l'intention de faire est de garder un pointeur vers la classe. Dans ce cas, vous devriez l'utiliser comme testController* BTW, pourquoi voulez-vous faire cela? Cela me semble un peu étrange.

+0

je testais juste la classe de base ... il est intented de tenir de nombreux contrôleurs du même type – gotch4

6
one day someone asked me why a class can't contain an instance of itself and i said; 
    one day someone asked me why a class can't contain an instance of itself and i said; 
    one day someone asked me why a class can't contain an instance of itself and i said; 
     ... 

utilisation indirection. un pointeur (intelligent) ou une réfrence à un testController plutôt qu'à un testController.

0

(un peu en retard à la fête, mais ...)

gotch4 Peut-être voulait dire taper quelque chose comme ça?

class testController : public baseController 
{ 
public: 
    testController tc(); // <-() makes this a c'tor, not a member variable 

    // (... snip ...) 
}; 
+0

merci ... mais après cinq ans, je ne me souviens pas vraiment pourquoi j'ai eu ce problème! – gotch4

+0

Bien sûr, mais d'autres pourraient trébucher sur cette question à l'avenir, et l'indice "Peut-être que vous vouliez ajouter un constructeur au lieu d'une déclaration de variable membre?" pourrait les aider. –

Questions connexes