2011-12-12 34 views
7

我有這個類,其中包含變量配置參數。我想將它包含在其他類中:JugadorHumanoJugadorIA,Main,PartidaClasica,PartidaMision在C++中聲明公共靜態變量時出現鏈接錯誤

#pragma once 

class Configuracion 
{ 
public: 
    static int MAX_ATAQUES; 
    static int DIV_TERRITORIOS; 
}; 

int Configuracion::MAX_ATAQUES = 5; 
int Configuracion::DIV_TERRITORIOS = 3; 

我想要的是能夠修改或讀取其他類的值。我不能聲明一個靜態變量並在聲明中定義它。如果沒有定義,我不能讓這些變量因爲我得到「未解決的外部」錯誤。

1>JugadorIA.obj : error LNK2005: "public: static int Configuracion::MAX_ATAQUES" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>JugadorIA.obj : error LNK2005: "public: static int Configuracion::DIV_TERRITORIOS" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>Main.obj : error LNK2005: "public: static int Configuracion::MAX_ATAQUES" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>Main.obj : error LNK2005: "public: static int Configuracion::DIV_TERRITORIOS" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>PartidaClasica.obj : error LNK2005: "public: static int Configuracion::MAX_ATAQUES" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>PartidaClasica.obj : error LNK2005: "public: static int Configuracion::DIV_TERRITORIOS" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>PartidaMision.obj : error LNK2005: "public: static int Configuracion::MAX_ATAQUES" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>PartidaMision.obj : error LNK2005: "public: static int Configuracion::DIV_TERRITORIOS" \ 
     ([email protected]@@2HA) already defined in JugadorHumano.obj 
1>D:\Leire\My Dropbox\Carpetas compartidas\Compartidos Victor\Practicas POO II\P3\P3M10\Debug\P3M10.exe : fatal error LNK1169: one or more multiply defined symbols found 

我應該怎麼做才能避免這種重新定義?我無法弄清楚,我也找不到類似的問題。

回答

12

您應該將定義寫入cpp文件,否則,一旦將頭文件包含到多個C++文件(翻譯單元)中,就會出現重定義錯誤。而#pragma一次只能在一個翻譯單元中運行。因此,你需要用下面的內容

#include "Configuracion.h" 

int Configuracion::MAX_ATAQUES = 5; 
int Configuracion::DIV_TERRITORIOS = 3; 

另外一個Configuration.cpp文件,如果你的類只包含靜態成員,你必須考慮讓一個命名空間,而不是一類的選項。

+1

如果你不想修改它們,你可以使它們爲const。所有大寫字母名稱通常表示const。 –

+0

非常感謝您的快速回答,解決了它! – Zhertal

+0

@armen:你救了我的一天。現在我需要回去閱讀翻譯部門。 –

3

將變量定義放在一個源文件中,並分別進行編譯和鏈接。

標題只能包含聲明和內聯函數。

#pragma once保護單個TU(翻譯單元);它不提供針對多個獨立TU的保護,包括(並因此定義)相同的變量。