需要不完整的类型/前向声明/编译理解

时间:2012-04-05 16:17:21

标签: c++ inheritance pointers forward-declaration

我有一个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);

};

我不确定我的尝试是否使用指向控制器对象的指针,以便我可以在运行时分配蛇不同的控制器是正确的,并且我知道使用前向声明的事情并不完全正确。我很欣赏最初的回复,并希望提供错误将允许您提供更多信息。我将继续尝试清理问题,以便我能够正确理解编译过程,但同时我真的很感激任何帮助!

1 个答案:

答案 0 :(得分:0)

在包含标题之前,不要将前向声明放在标题中。如果你在包含标题之前放置它,则每次包含标题之前都必须这样做。

这里似乎缺少的另一件事是重复包含警戒(使用#ifndef或#pragma一次)。

将来最好把你遇到的实际错误(编译器的错误信息)放在这里。