我有一个Snake类,它有一个指向Controller类对象的指针。该指针将被分配一些新数据,这是一个在运行时从控制器(例如AIController)派生的对象。
我需要Controller对象在构造时传递指向Snake的指针,以便我可以在控制器类中调用Snake Getters / Setter。
在线上,在Snake构造函数中,标记在下面的代码段中,我得到以下错误:
In constructor 'Snake::Snake()':|
error: expected type-specifier before 'PlayerController'|
error: cannot convert 'int*' to 'Controller*' in assignment|
error: expected ';' before 'PlayerController'|
段:
Snake::Snake() : _xVelocity(0), _yVelocity(0)
{
_controller = new PlayerController(this);
Initialise();
}
Snake的定义如下:
class Controller;
class Snake
{
public:
Snake();
virtual ~Snake();
...
private:
...
Controller* _controller;
};
这样的控制器:
#include "Snake.hpp"
class Controller
{
public:
Controller(Snake* s);
~Controller();
protected:
...
Snake* _s;
};
和PlayerController是这样的:
#include "Controller.hpp"
class PlayerController : public prg::IKeyEvent, public Controller
{
public:
PlayerController(Snake* s);
~PlayerController();
private:
virtual bool onKey (const prg::IKeyEvent::KeyEvent& key);
};
我不确定我的尝试是否使用指向控制器对象的指针,以便我可以在运行时分配蛇不同的控制器是正确的,并且我知道使用前向声明的事情并不完全正确。我很欣赏最初的回复,并希望提供错误将允许您提供更多信息。我将继续尝试清理问题,以便我能够正确理解编译过程,但同时我真的很感激任何帮助!
答案 0 :(得分:0)
在包含标题之前,不要将前向声明放在标题中。如果你在包含标题之前放置它,则每次包含标题之前都必须这样做。
这里似乎缺少的另一件事是重复包含警戒(使用#ifndef或#pragma一次)。
将来最好把你遇到的实际错误(编译器的错误信息)放在这里。