2012-04-05 1 views
0

J'ai une classe Snake, qui a un pointeur vers un objet de classe Controller. Ce pointeur recevra de nouvelles données, un objet dérivé du contrôleur (par exemple AIController), lors de l'exécution.Types incomplets/déclaration directe/compilation compréhension requise

J'ai besoin que les objets Contrôleur transmettent un pointeur à Snake lorsqu'ils sont construits pour que je puisse appeler des Getters/Setters Snake dans la classe du contrôleur.

Sur la ligne, dans le constructeur de serpent, battant pavillon dans l'extrait ci-dessous je reçois les erreurs suivantes:

In constructor 'Snake::Snake()':| 
error: expected type-specifier before 'PlayerController'| 
error: cannot convert 'int*' to 'Controller*' in assignment| 
error: expected ';' before 'PlayerController'| 

Snippet:

Snake::Snake() : _xVelocity(0), _yVelocity(0) 
{ 
    _controller = new PlayerController(this); 
    Initialise(); 
} 

Serpent est défini comme ceci:

class Controller; 

class Snake 
{ 
    public: 
     Snake(); 
     virtual ~Snake(); 
... 

    private: 
     ... 
     Controller* _controller; 


}; 

Contrôleur comme ceci:

#include "Snake.hpp" 

class Controller 
{ 
    public: 
     Controller(Snake* s); 
     ~Controller(); 


    protected: 
     ... 
     Snake* _s; 
}; 

et PlayerController comme ceci:

#include "Controller.hpp" 

class PlayerController : public prg::IKeyEvent, public Controller 
{ 
    public: 
     PlayerController(Snake* s); 
     ~PlayerController(); 


    private: 
     virtual bool onKey (const prg::IKeyEvent::KeyEvent& key); 

}; 

Je ne suis pas certain que ma tentative d'utiliser un pointeur vers un objet contrôleur afin que je puisse affecter les contrôleurs de serpents différents lors de l'exécution est correcte et je sais que somethings pas tout à fait raison avec mon utilisation de la déclaration avant. J'apprécie les réponses initiales et espère que fournir les erreurs vous permettra de me donner plus d'informations. Je vais continuer à essayer de nettoyer le problème afin que je puisse bien comprendre le processus de compilation, mais en attendant j'apprécierais vraiment toute aide!

+0

Vous avez deux fichiers d'en-tête qui se «# comprennent» l'un l'autre. C'est presque toujours faux. Forward-déclare 'classe Snake' dans' Controller.hpp', et déclare en avant 'classe Controller' dans' Snake.hpp'. –

+0

Ce serait plus simple si vous pouviez fournir un exemple de code minimal qui démontre votre problème, afin que nous puissions le compiler et essayer de changer (implémenter des classes qui ne font rien). Parfois, en essayant d'écrire un code minimal qui reproduit le problème, il devient plus facile de voir ce qui ne va pas et vous pourriez finir par découvrir comment le réparer vous-même ... Vous pouvez aussi poster les avertissements du compilateur ... – pzanoni

+0

erreur dans Snake :: Snake() est (très probablement) dans Snake.cpp. Avez-vous inclus Controller.hpp dans Snake.cpp? – selalerer

Répondre

0

Mettez les déclarations directes dans l'en-tête, il n'est pas nécessaire avant d'inclure l'en-tête. Si vous le mettez avant d'inclure l'en-tête, vous devez le faire à chaque fois avant d'inclure les en-têtes.

Une autre chose qui semble manquer ici est les gardes d'inclusion en double (soit aveC#ifndef ou aveC#pragma une fois).

Dans l'avenir, il est préférable de mettre ici les erreurs réelles que vous rencontrez (les messages d'erreur du compilateur).

+0

Merci pour le conseil, désolé j'ai inclus quelques détails de plus maintenant. J'ai des gardes d'inclusion sur chaque hpp, je n'ai pas les coller pour essayer de garder ma question bien rangée. Cela gardera cela à l'esprit dans le futur! – Holly