9

我有这个带有可变配置参数的类。我想将它包含在其他类中:JugadorHumano, JugadorIA, Main, PartidaClasica, PartidaMision.

#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" \
         (?MAX_ATAQUES@Configuracion@@2HA) already defined in JugadorHumano.obj
1>JugadorIA.obj : error LNK2005: "public: static int Configuracion::DIV_TERRITORIOS" \
         (?DIV_TERRITORIOS@Configuracion@@2HA) already defined in JugadorHumano.obj
1>Main.obj : error LNK2005: "public: static int Configuracion::MAX_ATAQUES" \
         (?MAX_ATAQUES@Configuracion@@2HA) already defined in JugadorHumano.obj
1>Main.obj : error LNK2005: "public: static int Configuracion::DIV_TERRITORIOS" \
         (?DIV_TERRITORIOS@Configuracion@@2HA) already defined in JugadorHumano.obj
1>PartidaClasica.obj : error LNK2005: "public: static int Configuracion::MAX_ATAQUES" \
         (?MAX_ATAQUES@Configuracion@@2HA) already defined in JugadorHumano.obj
1>PartidaClasica.obj : error LNK2005: "public: static int Configuracion::DIV_TERRITORIOS" \
         (?DIV_TERRITORIOS@Configuracion@@2HA) already defined in JugadorHumano.obj
1>PartidaMision.obj : error LNK2005: "public: static int Configuracion::MAX_ATAQUES" \
         (?MAX_ATAQUES@Configuracion@@2HA) already defined in JugadorHumano.obj
1>PartidaMision.obj : error LNK2005: "public: static int Configuracion::DIV_TERRITORIOS" \
         (?DIV_TERRITORIOS@Configuracion@@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

我应该怎么做才能避免我得到这个重新定义?我无法弄清楚,也找不到类似的问题。

4

2 回答 2

21

您应该在 cpp 文件中写入定义,否则,一旦将头文件包含到多个 C++ 文件(翻译单元)中,您将得到重新定义错误。而#pragma once 只在一个翻译单元内运行。所以需要一个Configuration.cpp文件,内容如下

#include "Configuracion.h"

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

此外,如果您的类仅包含静态成员,您可以考虑使用命名空间而不是类。

于 2011-12-12T19:09:43.907 回答
4

将变量定义放在源文件中,然后分别编译和链接。

标头应该只包含声明和内联函数。

#pragma once保护单个 TU(翻译单元);它不提供针对多个独立 TU 的保护,包括(并因此定义)相同的变量。

于 2011-12-12T19:12:57.557 回答