2011-12-12 26 views
7

Tengo esta clase con parámetros de configuración variables. Quiero incluirlo en otras clases: JugadorHumano, JugadorIA, Main, PartidaClasica, PartidaMision.Error de enlace al declarar variables estáticas públicas en C++

#pragma once 

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

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

Lo que quiero es poder modificar o leer los valores de las otras clases. No puedo declarar una variable estática y definirla en la declaración. No puedo dejar que las variables sin definición, ya sea porque obtengo errores "Externos no resueltos".

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 

¿Qué debo hacer para evitar esta redefinición que obtengo? No puedo resolverlo y no puedo encontrar un problema similar.

Respuesta

12

Debe escribir las definiciones en el archivo cpp, de lo contrario, una vez que incluya su archivo de encabezado en más de un archivo C++ (unidad de traducción), obtendrá errores de redefinición. Y #pragma una vez opera solo dentro de una unidad de traducción. Por lo que necesita un archivo Configuration.cpp con el siguiente contenido

#include "Configuracion.h" 

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

Además, si su clase contiene único miembro estático, usted tiene la opción de considerar que tiene un espacio de nombres en lugar de una clase.

+1

Si no desea modificarlos, puede hacerlos const. Todos los nombres de mayúsculas suelen indicar const. –

+0

Muchas gracias por la respuesta rápida, ¡eso lo resolvió! – Zhertal

+0

@armen: Me salvaste el día. Ahora necesito volver y leer sobre la unidad de traducción. –

3

Coloque las definiciones de variables en un archivo fuente y compile y vincule eso por separado.

El encabezado solo debe contener declaraciones y funciones en línea.

El #pragma once protege una sola TU (unidad de traducción); no proporciona protección contra múltiples TU independientes que incluyen (y por lo tanto definen) la misma variable.

Cuestiones relacionadas