2013-06-26 179 views
1

首先,讓我告訴你,我是C++的超級noob。所以,如果我問一些愚蠢的事,對不起,但我完全陷入困境。在頭文件中聲明指針? (C++)

我試圖將我在AS3中編寫的小遊戲引擎移植到C++,並且我已經開始使用核心遊戲類。它必須存儲這些關卡,以更新和管理它們,所以我認爲指針是最好的選擇。

標題是這樣的:

#pragma once 
#include "Level.h" 

class Game 
{ 
public: 
    Level *level; 
    Level *nextLevel; 
    Game(void); 
    virtual ~Game(void); 
    virtual void begin(); 
    virtual void onEveryFrame(); 
private: 
    void changeLevel(); 
}; 

而且編譯器會引發我對每一個指針聲明兩個錯誤:

錯誤1個錯誤C2143:語法錯誤:缺少 ';'之前'*'

錯誤2錯誤C4430:缺少類型說明符 - int假定。注意:C++ 不支持default-int

那麼,我在做什麼錯了?錯誤描述對我來說看起來不太具有描述性。

(我使用VS 2012快車)

編輯:

對不起你們!看起來像是一個循環依賴問題。實際上與指針無關。

的 「Level.h」 是這樣的:

#pragma once 
#include "Game.h" 

class Level 
{ 
public: 
    Game *game; 
    Level(void); 
    virtual ~Level(void); 
    virtual void begin(); 
    virtual void onEveryFrame(); 
}; 

對不起球員,小白錯誤。 :(

+4

'Level.h'看起來像什麼?另一方面,因爲你只是在學習C++,所以讓我告訴你,指針(特別是像你這樣的裸指針)很少是「走的路」。 – Chad

+2

如果您剛開始使用C++,請不要使用原始指針。 –

+0

+1快速學習:-)))。 @Bartek我不同意「不使用原始指針」的建議 - 它是C/C++ - 你必須學習!是的,他們是危險的,但是在C/C++等低級語言中避免它們的代價非常昂貴。我應該避免在C++中索引'[]'和'new'運算符嗎? ;-)。 –

回答

4
  1. Level.h絕對有望聲明Level型(最有可能的類),但它也有一些問題,防止要聲明Level類型。查看或發佈在這裏。
  2. Game.h頭其實並不需要了解Level類型的詳細信息,如果您Level.h頭預計將宣佈Level爲類,你都夠有您的Game.h標題中的聲明。這足以使用指針。當然,如果您嘗試操縱Level類型的對象,則需要查看其接口。所以你肯定需要Level.h包含在實現Game類的模塊中。

更新
我注意到你的編輯,循環依賴與我提到的聲明正好解決[2]。另外他們降低了項目垃圾並且增加了複雜性。這是C/C++中廣泛使用的技術(在C中通常是結構體或類似的東西)。這個想法是在你不需要實際的對象大小或者詳細的接口的地方聲明「它是類型的」。

+0

感謝您的回答羅馬。理解這個問題很有幫助。 – Hyaku

0

你的編譯器無法識別的類型Level,也許一個包含/錯字錯誤?

2

你有一個循環依賴關係,所以當編譯器還沒有關於什麼類型的「Level」或「Game」的信息時,無論你包含兩個類中的哪一個的頭文件都需要另一個的前向聲明「 將是。

該解決方案是一個簡單的向前拆解。

#pragma once 
#include "Level.h" 

class Level; 

class Game 
{ 
public: 
    Level *level; 
    Level *nextLevel; 
    Game(void); 
    virtual ~Game(void); 
    virtual void begin(); 
    virtual void onEveryFrame(); 
private: 
    void changeLevel(); 
}; 

並在Level標題中做遊戲的相互前向聲明。