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()
函数时实例化,并且实例化至少是线程安全的。这里有更多的信息,但是你应该询问一些特别的误解/误解。如果我的回答对你有帮助,你可以考虑接受它;