2014-05-05 19 views
0

我有5套的 「.H」 & 「的.cpp」 文件:使用一個變量,而不會導致圓形扶養

  • Main.cpp的
  • Game.h,Game.cpp
  • 家長。小時,Parent.cpp
  • Child1.h,Child1.cpp
  • Child2.h,Child2.cpp

麥n不包含類,也不包含頭文件 - 並且是應用程序的起點。除此之外,它使用收集的信息初始化類型爲「遊戲」的變量「myGame」。

Main.cpp的

#include "Game.h" 
... 
Game myGame(*parameters sent to constructor*) 

遊戲是我的應用程序的主體。它的頭部包含Child1和Child2,並用這些類型初始化變量。它聲明的類「遊戲」

Game.h

#pragma once 

#include "Child1.h" 
#include "Child2.h" 

class Game 
{ 
public: 
    Game(HWND hWnd, ...); 
    ~Game(); 

    Child1 child1Obj; 
    Child2 child2obj[20]; 
    ... 
private: 
    ... 
}; 

家長概括了兩個子類,並提供像函數和變量。它的標題不包含其他文件。

Parent.h

#pragma once 

class Parent 
{ 
public: 
    Parent(void); 
    ~Parent(void); 
    ... 
}; 

Child1和CHILD2都是相似的,並且包括母頭。

Child1.h

#pragma once 
#include "Parent.h" 

class Child1 : 
    public Parent 
{ 
public: 
    Child1(); 
    ~Child1(); 
}; 

我希望能夠在ParentChild1Child2使用包含在Game數據。

我的第一個猜測是簡單地將#include "Game.h"插入到Parent.h的頂部,但這樣做會導致循環依賴。

接下來,我以爲我只是必須引用實際的遊戲對象myGame.(在Main.cpp創建),每當我想用變量和函數Game。但我不知道該怎麼做。也許我可以提前一個Main.h文件中聲明myGame類似如下:

Main.h

#pragma once 
#include "Game.h" 

Game myGame; 

但爲了做到這一點我還是不得不使用#include "Game.h",並且包括「主.h「在我想使用myGame的文件的頂部 - 導致了與上述相同的循環依賴問題。

有什麼辦法,我可以:

  1. 聲明類型遊戲中的未初始化myGame在 「Main.h」
  2. 初始化myGame在 「Main.cpp的」
  3. 使用myGame收集的信息在Parent,Child1和Child2中,通過包含myGame被聲明的文件,而不引起循環依賴。

Am I abl e在「Main.h」中使用#include "Game.h"創建一個Game變量,但是阻止包含繼承到包含「Main.h」的文件?

+0

Parent,Child1和Child2如何使用Game?也許你可以使用遊戲的前鋒。 – kec

+1

MacklinB,當然這種類型的問題都出現在[C]和[C++]中。但是,問題代碼顯然不是[C]。也許你應該考慮編輯你的問題,並刪除[C]標籤? –

+1

在'Parent.cpp'中執行#include「Game.h」''。 'Parent'類定義不能依賴'Game',儘管它可以通過前向聲明接受指針或引用。當然,'Parent.cpp'中的函數體可以使用完整的'Game's。 –

回答

2

前向聲明允許引用尚未定義的對象,但不能在沒有定義的情況下實例化。它說「我稍後會告訴你」。

非法:

class myGame; // forward declaration, I'll tell you about this later 
class myPlayer 
{ 
public: 
    myPlayer(); 
protected: 
    myGame theGame; 
} 

法律:

class myGame; // forward declaration, I'll tell you about this later 
class myPlayer 
{ 
public: 
    myPlayer(); 
protected: 
    myGame* theGame; 
} 

的 「後來」,你答應在頭文件編譯器,是源文件。

myPlayer.cpp:

#inlcude "myPlayer.h" 

// Tell the compiler what a myGame is, 
// other than something that can be pointed at 
#inlcude "myGame.h" 

myPlayer::myPlayer() : 
    theGame(new myGame()) 
{ 
} 

自然地,一個真正的程序將基本上更加複雜,參數構造等,這示範是關於類的結構,這些文件描述它們和它們的互鎖關係。

前向聲明的缺點是編譯器沒有獲得關於正在聲明的對象的信息,所以它不能創建一個 - 因此,它不能將一個對象放在另一個對象內。話雖如此,你可以指出其中一個,因爲你曾經說過這樣的事情就像你曾經向前宣佈過的東西一樣,因此用這些東西做事情是合法的,比如拿他們的內存地址並因此指向他們,或者提及一個。

在編譯器深入到源文件中.cpp時,您已交付了前向聲明對象的定義,現在它知道它們是什麼以及可以使用它們做什麼。這就是你可以用指針或引用做點事情的地方,比如做一個new之一,或者調用函數。

+0

當我在'Parent.h'中有'#include'Game.h「'時,它解決了我的200多個錯誤,但是當我嘗試在我的'Parent'類下使用任何類型時會導致錯誤。 Child1和Child2也在我的類聲明「'Parent':base class undefined」處出錯。 – MacklinB

+0

您的編輯對我無效,因爲在myPlayer.cpp中創建myGame的實例時,我需要傳遞3個參數,這些參數在myPlayer中不可用 - 但在Main中。 – MacklinB

+0

@MaklinB,你沒有提到你的問題。也許你想問一個新的問題? – Josh