Ошибка ссылки при объявлении публичных статических переменных в C ++ - PullRequest
8 голосов
/ 12 декабря 2011

У меня есть этот класс с переменными параметрами конфигурации.Я хочу включить его в другие классы: 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;

Я хочу иметь возможность изменять или читатьзначения из других классов.Я не могу объявить статическую переменную и определить ее в объявлении.Я также не могу разрешить эти переменные без определения, потому что я получаю ошибки «Unresolved External».

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

Что я должен сделать, чтобы избежать этого переопределения, которое я получаю?Я не могу понять это, и я не могу найти подобную проблему.

Ответы [ 2 ]

16 голосов
/ 12 декабря 2011

Вы должны записать определения в файл cpp, в противном случае, как только вы включите файл заголовка в более чем один файл C ++ (единицу перевода), вы получите ошибки переопределения.И #pragma однажды действует только в пределах одного блока перевода.Поэтому вам нужен файл Configuration.cpp со следующим содержимым

#include "Configuracion.h"

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

Кроме того, если ваш класс содержит только статический член, у вас есть возможность рассмотреть использование пространства имен вместо класса.

4 голосов
/ 12 декабря 2011

Поместите определения переменных в исходный файл, скомпилируйте и скомпонуйте их отдельно.

Заголовок должен содержать только объявления и встроенные функции.

#pragma once защищает один TU (блок перевода); он не обеспечивает защиту от нескольких независимых TU, включая (и, следовательно, определяя) одну и ту же переменную.

...