5

我正在寫一些代碼,我需要有一個類變量是一個靜態詮釋數組。我知道我可以在頭文件中這樣的事情做到這一點,阿:靜態數組類變量「多重定義」C++

#ifndef A_H_ 
#define A_H_ 

class A 
{ 
public: 
    static const int a[]; 
}; 

const int A::a[] = {1,2}; 

#endif 

這一切正常,如果我那麼包括這個頭只在一個其他的文件,像下面這樣,主。 CPP:

#include "A.h" 

#include <iostream> 
using namespace std; 

int main() 
{ 

    A myA; 
    cout << "0: " << myA.a[0] << endl; 
    cout << "1: " << myA.a[1] << endl; 
} 

但是假設我需要我的A級更復雜一點,我想有一個A.cpp文件中。我會繼續我的main.cpp文件是相同的,但後來改啊如下(我只是增加了一個功能,printA):

#ifndef A_H_ 
#define A_H_ 

class A 
{ 
public: 
    void printA() const; 
    static const int a[]; 
}; 

const int A::a[] = {1,2}; 

#endif 

然後在文件A.cpp:

#include "A.h" 

#include <iostream> 
using namespace std; 

void A::printA() const 
{ 

    cout << "Printing in A.cpp." << endl; 
    cout << "A.0: " << a[0] << endl; 
    cout << "A.1: " << a[1] << endl; 

} 

使用gcc -o Ao -c編譯Ao -c A.cpp很好。但是,在編譯main.cpp(gcc -o atest main.cpp A.o)時,將其與「A :: a'的多重定義」進行連接失敗。

我一直在搜索互聯網尋找解決方案,並發現人們在其頭文件中聲明的變量在多個地方包含頭文件時得到「多重定義」錯誤,並且解決方案似乎是聲明頭文件中的變量extern,然後只在一個源(非頭文件)源文件中定義它。但是我不能聲明靜態和外部類型的變量,我可以嗎?如果我嘗試,或者如果我只是聲明它是外部的,我會得到一個關於變量不是靜態的警告(當我嘗試這兩個時,也是一個「衝突的說明符」錯誤)。

所以,我的問題:是否有可能有靜態數組類變量的情況下,頭文件需要包含在多個源文件?如果是這樣,怎麼樣?

回答

17

您違反了一個定義規則。移動定義的實現文件中:

//A.cpp 
#include "A.h" 
const int A::a[] = {1,2}; 

你reffering到,與extern解決方案,適用於非成員變量。在你的情況下,a是一個班級成員。

7

您應該刪除「const int A :: a [] = {1,2};」從頭文件行。把這個定義行放在你的一個.cpp文件中。 然後,您可以在需要的地方多次包含頭文件。