2016-01-22 37 views
1

我試圖使類功能,我可以粘貼到其他類,如嵌套類。我對C++還是比較陌生的,所以我可能不會嘗試使用嵌套類,但是據我所知,這就是我所處的位置。通過文件嵌套的類定義和啓動

現在,我剛剛在Chrome中寫了這個,所以它沒有真正的用處,但我想保持代碼簡短。

我編寫在Windows 7上,使用Visual Studio 2015年

我在file_1.h兩類:

#pragma once 
#include "file_2.h" 
class magic_beans{ 
public: 
    magic_beans(); 
    ~magic_beans(); 

    int getTotal(); 
private: 
    double total[2]; //they have magic fractions 
} 

class magic_box{ 
public: 
    magic_box(); //initiate 
    ~magic_box(); //make sure all objects have been executed 

    void update(); 

    magic_beans beans; //works fine 
    magic_apples apples; //does not work 

private: 
    int true_rand; //because it's magic 
}; 

...而且我有一個file_2.h類:現在

#pragma once 
#include "file_1.h" 
class magic_apples{ 
public: 
    magic_apples(); 
    ~magic_apples(); 

    int getTotal(); 
private: 
    double total[2]; 
} 

,我發現我可以簡單地改變:

magic_apples apples; 

要:

class magic_apples *apples; 

而在我的構造我補充一下:

apples = new magic_apples; 

而在我的析構函數,我可以告訴大家:

delete apples; 

我爲什麼必須引用定義的類一個使用指針的外部文件,而本地定義的一個很好?

理想情況下,我希望能夠像定義magic_beans一樣定義magic_apples。我不反對使用指針,但保持我的代碼相當統一我有興趣找到一種替代定義方法。

我已經在file_1.h的magic_box類中嘗試了一些magic_apples的替代定義,但是我一直無法獲得任何其他的工作。

+0

「爲什麼要我指的是使用指針外部文件中定義的類,而一個本地定義是罰款?」誰告訴過你的!?!? –

+0

順便說一句,你有流通包括沒有後衛..看到這個http://stackoverflow.com/questions/4767068/c-header-guards –

+0

我還沒有任何正式的培訓使用c + +,只有c,所以我在我大部分時間都在這裏。 我在所有頭文件中都使用了#pragma。 – Jarred

回答

3

你有一個循環依賴關係,file_1.h取決於file_2.h這取決於file_1.h等等。沒有頭數量包括守衛或編譯指示可以解決這個問題。

有解決問題的兩種方法,以及一個方法是使用前置聲明指針。指針可以解決這個問題,因爲使用指針不需要完整的類型。

解決它的另一種方法是break循環依賴。通過查看您顯示的結構,似乎magic_apples不需要magic_beans類型,因此您可以通過簡單地不包含file_1.h來打破該圈。所以file_2.h應該像

#pragma once 
// Note no include file here! 
class magic_apples{ 
public: 
    magic_apples(); 
    ~magic_apples(); 

    int getTotal(); 
private: 
    double total[2]; 
} 
+0

當然,我重新安排了我的頭文件,並在其他地方出現了問題。看起來我有很多工作要解決這個問題。我會更合適地分割和組織我的標題。 現在感覺就像一個微不足道的問題,只是一次我想問一個問題,讓它成爲一個嚴重的問題,但同時感謝上帝它永遠不會! – Jarred

+0

經過45分鐘的移動#包括和原型周圍,我把它編譯爲最初的目的。不要因爲它的作用而忽略它。得到它了。 – Jarred