错误 LNK2001:未解析的外部符号"私有:静态类
error LNK2001: unresolved external symbol "private: static class
错误LNK2001:未解析的外部符号"private:static class irrklang::ISoundEngine*游戏引擎::声音::_soundDevice"(?_soundDevice@Sound@游戏引擎@@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();
声音.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中已经存在的内容的补充。
我在堆栈数组定义方面也遇到了同样的问题。所以,让我在这里简单解释一下。
在头文件中:
class MyClass
{
private:
static int sNums[55]; // Stack array declaration
static int* hNums; // Heap array declaration
static int num; // Regular variable declaration
}
在C++文件中
int MyClass::sNums[55] = {}; // Stack array definition
int MyClass::hNums[55] = new int[55]; // Heap array definition
int MyClass::num = 5; // Regular variable Initialization
如果可以使用C++17,则可以声明inline static
数据成员:
private:
inline static irrklang::ISoundEngine* _soundDevice;
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 在类定义之后定义一个私有方法
- vscode g++链路故障:体系结构x86_64的未定义符号
- 概念TS检查忽略私有访问修饰符
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 类与私有变量的其他类之间的线程安全性
- 私有类型的静态常量成员
- 使用gcc从静态链接的文件中查找可选符号
- QT私有API未解决的外部符号
- 未解析的外部符号"私有:静态浮点 对象信息::旋转
- 静态地将私有库链接到公共库以隐藏符号
- 错误 LNK2019:函数"私有:无效__cdecl"中引用的未解析的外部符号 KHPU
- 错误 LNK2001:未解析的外部符号"私有:静态类
- 模板私有静态变量成员的未定义符号