c++中声明公共静态变量时的链接错误



我有一个具有可变配置参数的类。我想把它包括在其他类: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:LeireMy DropboxCarpetas compartidasCompartidos VictorPracticas POO IIP3P3M10DebugP3M10.exe : fatal error LNK1169: one or more multiply defined symbols found

我应该做些什么来避免我得到的这种重新定义?我不明白,我找不到类似的问题

应该在cpp文件中编写定义,否则,一旦将头文件包含到多个c++文件(翻译单元)中,就会出现重定义错误。#pragma只在一个翻译单元内操作一次。因此,您需要一个Configuration.cpp文件,其内容如下

#include "Configuracion.h"
int Configuracion::MAX_ATAQUES = 5;
int Configuracion::DIV_TERRITORIOS = 3;

同样,如果您的类只包含静态成员,您可以选择考虑使用名称空间而不是类。

将变量定义放在源文件中,并单独编译和链接。

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

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

相关内容

  • 没有找到相关文章

最新更新