2012-04-05 44 views
0

我有一个Snake类,它有一个指向Controller类对象的指针。该指针将在运行时分配一些新数据,这是一个从控制器派生的对象(例如AIController)。不完整类型/前向声明/需要编译理解

我需要Controller对象传递一个指向Snake的指针,以便我可以在控制器类中调用Snake Getters/Setters。

就行了,在蛇的构造,标记在片段下面我得到以下错误:

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

蛇是这样定义的:

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

你有两个头文件''包括'对方。这几乎总是错误的。 在'Controller.hpp'中前向声明'class Snake',并在'Snake.hpp'中前向声明'class Controller'。 – 2012-04-05 16:28:54

+0

如果你能提供一个能够证明你的问题的简单示例代码,那么它会更容易,所以我们可以编译它并尝试改变(实现不做任何事的类)。有时候,当试图编写一个能够再现问题的最小代码时,就会更容易发现错误,并最终发现如何自己修复它......您还可以发布编译器警告,您会看到...... – pzanoni 2012-04-05 16:29:03

+0

The Snake :: Snake()中的错误(最可能)是Snake.cpp中的错误。您是否在Snake.cpp中包含Controller.hpp? – selalerer 2012-04-05 18:03:48

回答

0

在包含标题之前,将前向声明置于标题中。如果您在包含标题之前添加它,则必须在每次包含标题之前执行此操作。

另一件似乎在这里丢失的东西是重复的包含守卫(无论是#ifndef还是#pragma一次)。

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

+0

感谢您的意见,对不起,我已经包括了一些更多的细节。我在每个hpp上都有包含警卫,我只是没有粘贴它们来尝试保持我的问题整洁。将来要牢记这一点! – Holly 2012-04-05 17:49:18