2011-12-12 18 views
7

このクラスには可変構成パラメータがあります。私は他のクラスに含めたい:JugadorHumanoJugadorIAMainPartidaClasicaPartidaMisionC++でpublic static変数を宣言するときのリンクエラー

私が望むのは、他のクラスの値を変更または読み取ることです。私は静的変数を宣言することはできませんし、宣言でそれを定義することはできません。私は "未解決の外部"エラーが発生するため、定義なしでその変数を許可することはできません。

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は1回の翻訳単位で1回しか動作しません。あなたのクラスが唯一の静的メンバが含まれているのであれば、あなたは、以下の内容も

#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に対して保護を提供しません。

関連する問題