Ошибка LNK2001: неразрешенный внешний символ "private: статический класс
ошибка LNK2001: неразрешенный внешний символ "private: static class irrklang:: ISoundEngine * GameEngine:: Sound:: _ soundDevice" (? _soundDevice @Sound @GameEngine @@0PAVISoundEngine @irrklang @@A)
Я не могу понять, почему я получаю эту ошибку. Я считаю, что я правильно инициализирую. Может кто-нибудь протянуть руку?
sound.h
class Sound
{
private:
static irrklang::ISoundEngine* _soundDevice;
public:
Sound();
~Sound();
//getter and setter for _soundDevice
irrklang::ISoundEngine* getSoundDevice() { return _soundDevice; }
// void setSoundDevice(irrklang::ISoundEngine* value) { _soundDevice = value; }
static bool initialise();
static void shutdown();
sound.cpp
namespace GameEngine
{
Sound::Sound() { }
Sound::~Sound() { }
bool Sound::initialise()
{
//initialise the sound engine
_soundDevice = irrklang::createIrrKlangDevice();
if (!_soundDevice)
{
std::cerr << "Error creating sound device" << std::endl;
return false;
}
}
void Sound::shutdown()
{
_soundDevice->drop();
}
и где я использую звуковое устройство
GameEngine::Sound* sound = new GameEngine::Sound();
namespace GameEngine
{
bool Game::initialise()
{
///
/// non-related code removed
///
//initialise the sound engine
if (!Sound::initialise())
return false;
Любая помощь будет принята с благодарностью
Ответы
Ответ 1
Поместите это в sound.cpp
:
irrklang::ISoundEngine* Sound::_soundDevice;
ПРИМЕЧАНИЕ. Вы также можете инициализировать его, например:
irrklang::ISoundEngine* Sound::_soundDevice = 0;
static
, но члены данных не const
должны быть определены вне определения класса и внутри пространства имен, охватывающего класс. Обычная практика заключается в том, чтобы определить ее в блоке трансляции (*.cpp
), поскольку она рассматривается как деталь реализации. Одновременно (определение внутри класса) могут быть объявлены и определены только static
и const
интегральные типы:
class Example {
public:
static const long x = 101;
};
в этом случае вам не нужно добавлять определение x
, поскольку оно уже определено внутри определения класса. Однако в вашем случае это необходимо. Выдержка из раздела 9.4.2 стандарта С++:
Определение для статического члена данных должно появиться в области пространства имен, охватывающей определение класса членов.
Ответ 2
В конце концов, ответ, данный @Alexander, разрешил аналогичную проблему в моем собственном коде, но не без нескольких испытаний. В интересах следующего посетителя, когда он говорит "Положите это в sound.cpp", чтобы быть совершенно ясным, это в дополнение к тому, что уже присутствует в sound.h.