erreur LNK2001: symbole externe non résolu "privé: classe statique irrklang :: ISoundEngine * GameEngine :: Sound :: _ soundDevice" (? _soundDevice @ Sound @ GameEngine @@ 0PAVISoundEngine @ irrklang @@ A))
Je ne peux pas comprendre pourquoi je reçois cette erreur. Je crois que j'initialise correctement. Est-ce que quelqu'un peut me donner un coup de main?
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();
}
et où j'utilise l'appareil audio
GameEngine::Sound* sound = new GameEngine::Sound();
namespace GameEngine
{
bool Game::initialise()
{
///
/// non-related code removed
///
//initialise the sound engine
if (!Sound::initialise())
return false;
Toute aide serait grandement appréciée
Mettez ceci dans sound.cpp
:
irrklang::ISoundEngine* Sound::_soundDevice;
REMARQUE: Vous pouvez également l'initialiser, par exemple:
irrklang::ISoundEngine* Sound::_soundDevice = 0;
static
, mais les membres de données non - const
doivent être définis en dehors de la définition de classe et à l'intérieur de l'espace de noms entourant la classe. La pratique habituelle consiste à le définir dans l'unité de traduction (*.cpp
) car il est considéré comme un détail d'implémentation. Seuls les types intégraux static
et const
peuvent être déclarés et définis en même temps (dans la définition de classe):
class Example {
public:
static const long x = 101;
};
dans ce cas, vous n'avez pas besoin d'ajouter la définition x
car elle est déjà définie dans la définition de classe. Cependant, dans votre cas, c'est nécessaire. Extrait de section 9.4.2 de la norme C++:
La définition d'un membre de données statiques doit apparaître dans une étendue d'espace de noms contenant la définition de classe du membre.
Finalement, la réponse donnée par @Alexander a résolu un problème similaire dans mon propre code, mais pas sans quelques essais. Pour le bénéfice du prochain visiteur, quand il dit "Mettez ceci dans sound.cpp", pour être parfaitement clair, c'est en plus de ce qui est déjà présent dans sound.h.