エラー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;
どんな助けでも大歓迎です
これを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
定義はクラス定義内ですでに定義されているため、追加する必要はありません。ただし、あなたの場合は必要です。 C++標準のセクション9.4.2からの抜粋:
静的データメンバーの定義は、メンバーのクラス定義を囲む名前空間スコープに表示されます。
最終的に、@ Alexanderの回答により、自分のコードで同様の問題が解決しましたが、いくつかの試行が必要でした。次の訪問者のために、「これをsound.cppに入れる」と完全に明確に言うと、これはすでにsound.hにあるものに追加されます。