C++ Player.obj:错误LNK2001:未解析的外部符号“;私有:静态类InputHandler*InputHandler::s_pInstance";
希望有人能帮我解决这个我不知道如何处理的小错误:) 下面是头文件:C++ Player.obj:错误LNK2001:未解析的外部符号“;私有:静态类InputHandler*InputHandler::s_pInstance";,c++,C++,希望有人能帮我解决这个我不知道如何处理的小错误:) 下面是头文件: #ifndef __InputHandler__ #define __InputHandler__ #include "SDL.h" #include <SDL_image.h> #include <vector> #include <iostream> enum mouse_buttons { LEFT = 0, MIDDLE = 1, RIGHT = 2, };
#ifndef __InputHandler__
#define __InputHandler__
#include "SDL.h"
#include <SDL_image.h>
#include <vector>
#include <iostream>
enum mouse_buttons {
LEFT = 0,
MIDDLE = 1,
RIGHT = 2,
};
class InputHandler {
public:
bool getMouseButtonState(int buttonNumber) {
return m_mouseButtonStates[buttonNumber];
}
std::vector<bool> m_mouseButtonStates;
static InputHandler* Instance() {
if (s_pInstance == 0) {
s_pInstance = new InputHandler();
}
return s_pInstance;
}
void update();
void clean();
private:
InputHandler();
~InputHandler() {}
static InputHandler* s_pInstance;
};
#endif
下面是我得到的错误:
Player.obj : error LNK2001: unresolved external symbol
"private: static class InputHandler * InputHandler::s_pInstance"
老实说,我不知道发生了什么,也不知道错误指向了什么。非常感谢你的智慧:))
“老实说,我不知道发生了什么,也不知道错误指向了什么。”
链接器错误消息几乎可以告诉您缺少什么。当前的问题是缺少
静态InputHandler*s_pInstance的定义代码>翻译单元中的成员。应该是这样的:
InputHandler* InputHandler::s_pInstance = 0;
static InputHandler& Instance() {
static InputHandler theInputHandler;
return theInputHandler;
}
尽管您的单例模式方法有一些缺陷和不足(特别是在线程安全方面)。你应该像这样简化你的工作:
InputHandler* InputHandler::s_pInstance = 0;
static InputHandler& Instance() {
static InputHandler theInputHandler;
return theInputHandler;
}
或者如果你坚持使用指针
static InputHandler* Instance() {
static InputHandler theInputHandler;
return &theInputHandler;
}
这通常被称为“斯科特·迈耶的单身习语”,这里有一些关于原始推理的更多信息
必须在类声明之外提供静态成员s_pInstance
的定义。由于s_pInstance是指针类型变量,我是否在my Player.cpp中将其声明为全局变量?像这样吗?静态InputHandler*s_pInstance=0;谢谢,这很有魅力。你能解释一下你在那里做了什么使它工作吗?@DaiDao你是说为什么局部静态变量工作?它保证在第一次调用InputHandler::Instance()
函数时实例化,并且实例化至少是线程安全的。这里有更多的信息,但是你应该询问一些特别的误解/误解。如果我的回答对你有帮助,你可以考虑接受它;