2012-02-19 16 views
0

我在嘗試使用沒有初始大小的結構數組時遇到了問題。 我該怎麼做?這是我的結構:C++中的全局動態分配結構

struct carbon { 
    double temp; 
    double mass; 
    rowvec::fixed<3> position;  
    rowvec::fixed<3> velocity; 
    rowvec::fixed<3> force; 
} *atom; 

在我的節目,我分配結構數組的大小是這樣的:

atom = new carbon[PARTICLE_NUM]; 

的問題是我怎麼那麼使用這個結構在其他文件中。我創建了一個頭文件,並把這個在它

extern struct carbon *atom; 

但與此錯誤出現:

setup_pos.cpp:19: error: invalid use of incomplete type ‘struct carbon’ 
system_setup_distances.h:18: error: forward declaration of ‘struct carbon’ 

我知道我不應該使用全局變量,但我只是想先測試一下。 在此先感謝您的幫助。

+1

你爲什麼使用動態「數組」?爲什麼不是'vector'?或者就此而言,只是一個正常的數組? – 2012-02-19 15:51:36

+0

如何在編譯時不知道大小的情況下創建全局向量結構? – Eddy 2012-02-19 16:29:31

+0

「矢量」的整點是它的大小是動態的。雖然我不確定「矢量結構」是什麼意思 – 2012-02-19 16:41:15

回答

1

您使用​​的源文件需要carbon結構的完整定義。

與外部把結構在同一個頭文件,像這樣:

struct carbon { 
    double temp; 
    double mass; 
    rowvec::fixed<3> position;  
    rowvec::fixed<3> velocity; 
    rowvec::fixed<3> force; 
}; 

extern struct carbon *atom; 

在源文件中的一個定義的變量​​:

struct carbon *atom = 0; 

現在,每當你需要訪問​​,包含結構和extern聲明所在的頭文件,並且它應該工作。

PS。而不必在全局命名空間的​​可變的,你可以把它放在自己的命名空間:

namespace some_clever_name 
{ 
    struct carbon { ... }; 
    extern carbon *atom; 
} 

,並把這個在源文件:

some_clever_name::carbon *some_clever_name::atom = 0; 
1

結構的定義需要在頭文件中。

1

您需要包括在頭文件結構carbon的定義,然後包括你在哪裏得到那些不完整的類型錯誤的文件(.h.cpp),其頭文件。

爲什麼錯誤?
無論何時使用前向聲明,該類型都會變成編譯器的未完成類型,這是因爲編譯器只知道前向聲明的實體是數據類型,但它不知道任何關於佈局或其內部的信息,所以如果你需要執行任何需要編譯器來操作錯誤的類型佈局的操作。

在你的情況下,編譯器需要知道結構carbon的大小來分配足夠的內存,它不能因爲它是前向聲明類型,因此它抱怨錯誤。

+0

是的,但如果我想在多個文件中使用該結構,則會出現問題。例如,如果我在setup_pos.cpp和system_setup_distances.cpp中使用該頭文件,這是我得到的錯誤:'setup_pos.o和system_setup_distances.o中的重複符號_atom – Eddy 2012-02-19 15:58:00

+0

@Eddy:只包含結構定義,通過使用extern在cpp文件中僅創建一次全局實例。 – 2012-02-19 16:00:34

+0

@Eddy:那是因爲你已經通過定義類型,並且爲一個類型的實例創建了一個指針,所有這些都在一個語句中讓你感到困惑。 – 2012-02-19 16:42:15

0

至於其他的答案說,你需要將結構的定義包含在頭文件中。但讓我們問自己爲什麼你需要這個?

C++從一開始就基於C,並從C繼承了一種簡單的編譯策略:編譯器進行一次傳遞,編譯器和鏈接器都不需要訪問除提供文件之外的任何內容。當C和UNIX首次開發時,地址空間有限,處理器速度比大多數人想象的要慢 - 我的Kindle Fire比我在90年代以前使用的任何其他電腦都要大。因爲他們使編譯器變得簡單,而不是像PL/I(C的祖先之一)那樣使用更復雜的方案,他們構建了預處理器並使用包含文件。編譯器需要知道結構的「形狀」,以便它可以生成代碼 - 例如,如果您想訪問mass,則需要知道結構開頭的偏移量。因此,在C和C++中,您需要在文本中包含該「形狀」的描述。

+1

'處理器比大多數人想象的要慢'不,他們只是比大多數人想象的要快得多「可笑,快得多」 – 2012-02-19 16:42:44

+0

好吧,我承認它,我被寵壞了。 – 2012-02-20 18:40:49