【问题标题】:Incomplete types/ forward declaration / compilation understanding needed需要不完整的类型/前向声明/编译理解
【发布时间】:2012-04-05 16:17:20
【问题描述】:

我有一个 Snake 类,它有一个指向 Controller 类对象的指针。该指针将在运行时分配一些新数据,即从控制器(例如 AIController)派生的对象。

我需要在构造控制器对象时将指针传递给 Snake,以便我可以在控制器类中调用 Snake Getters/Setters。

在线上,在 Snake 构造函数中,在下面的 sn-p 中标记我得到以下错误:

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);

};

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

【问题讨论】:

  • 您有两个#include 彼此的头文件。这几乎总是错误的。在Controller.hpp 中前向声明class Snake,在Snake.hpp 中前向声明class Controller
  • 如果你能提供一个最小的示例代码来演示你的问题会更容易,所以我们可以编译它并尝试改变(实现不做任何事情的类)。有时,当尝试编写重现问题的最小代码时,更容易发现问题所在,最终您可能会发现如何自己修复它...您还可以发布您看到的编译器警告...跨度>
  • Snake::Snake() 中的错误(很可能)在 Snake.cpp 中。您是否在 Snake.cpp 中包含 Controller.hpp?
  • @selalerer 谢谢,我转发了在 Snake.hpp 中声明的控制器。我能够通过在 Snake.cpp 中包含 PlayerController 来编译它。这可能是我所缺少的!但我不相信我的整体结构是合适的。仍然我想它会做,直到我能得到更多的意见:)

标签: c++ inheritance pointers forward-declaration


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的建议,抱歉,我现在提供了更多详细信息。我确实在每个 hpp 上都有包含保护,我只是没有粘贴它们来尝试保持我的问题整洁。将来会牢记这一点!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 2011-10-22
  • 2013-07-09
  • 1970-01-01
相关资源
最近更新 更多