2012-04-05 56 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