2011-12-12 16 views
7

Ho questa classe con parametri di configurazione variabili. Voglio includerlo in altre classi: JugadorHumano, JugadorIA, Main, PartidaClasica, PartidaMision.Errore di collegamento quando si dichiarano variabili statiche pubbliche in C++

#pragma once 

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

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

Quello che voglio è essere in grado di modificare o leggere i valori dalle altre classi. Non posso dichiarare una variabile statica e definirla nella dichiarazione. Non riesco a lasciare che le variabili senza definizione o perché ottengo gli errori "Esterno non risolto".

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 

Cosa devo fare per evitare questa ridefinizione? Non riesco a capirlo e non riesco a trovare un problema simile.

risposta

12

Si dovrebbero scrivere le definizioni nel file cpp, altrimenti, una volta incluso il file di intestazione in più di un file C++ (unità di traduzione), si avranno errori di ridefinizione. E #pragma funziona una volta sola all'interno di un'unità di traduzione. Quindi è necessario un file Configuration.cpp con il seguente contenuto

#include "Configuracion.h" 

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

Inoltre, se la classe contiene solo membro statico, si ha la possibilità di prendere in considerazione avere uno spazio dei nomi al posto di una classe.

+1

Se non si desidera modificarli, è possibile renderli const. Tutti i nomi in maiuscolo indicano in genere const. –

+0

Grazie mille per la risposta rapida, che l'ha risolto! – Zhertal

+0

@armen: mi hai salvato la giornata. Ora ho bisogno di tornare a leggere sull'unità di traduzione. –

3

Inserire le definizioni di variabile in un file di origine e compilarlo e collegarlo separatamente.

L'intestazione deve contenere solo dichiarazioni e funzioni inline.

Il #pragma once protegge una singola TU (unità di traduzione); non fornisce alcuna protezione contro più TU indipendenti incluse (e quindi definendo) la stessa variabile.

Problemi correlati