错误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;
任何帮助都将不胜感激
4条答案
按热度按时间c7rzv4ha1#
把这个放入
sound.cpp
:**注意:**您可能也想初始化它,例如:
static
,但非const
的数据成员应该在类定义之外和包含类的命名空间内定义。通常的做法是在翻译单元(*.cpp
)中定义,因为它被认为是实现细节。只有static
和const
整型可以同时声明和定义(在类定义内部):在这种情况下,您不需要添加
x
定义,因为它已经在类定义中定义了。但是,在您的情况下,这是必要的。摘自C++标准9.4.2节:静态数据成员的定义应出现在包含该成员的类定义的命名空间范围中。
hmtdttj42#
最终,@ Alexandria 给出的答案解决了我自己代码中的一个类似问题,但不是没有几次尝试。为了下一个访问者的利益,当他说“把这个放入sound.cpp”时,要非常清楚,这是对sound.h中已经存在的内容的补充。
wztqucjr3#
我在堆栈数组定义上也遇到了同样的问题。所以,让我在这里简单地解释一下。
在头文件中:
在C++文件中
9avjhtql4#
如果你可以使用C++(17),你可以只声明内联静态数据: