Player.obj:错误LNK2001:未解析的外部符号"私有:静态类InputHandler * InputHandler :: s_pInstance"

时间:2014-08-07 03:39:00

标签: 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,
};

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.cpp中调用InputHandler :: Instance()函数

#include "InputHandler.h"

void Player::handleInput() {
    if (InputHandler::Instance()->getMouseButtonState(LEFT)) {
        m_velocity.setX(1);
    }
}

这是我得到的错误:

Player.obj : error LNK2001: unresolved external symbol 
    "private: static class InputHandler * InputHandler::s_pInstance"

老实说,我不知道发生了什么以及错误指向了什么。真的非常感谢你的智慧:)))

1 个答案:

答案 0 :(得分:1)

  

&#34;老实说,我不知道发生了什么以及错误指向的是什么。 &#34;

链接器错误消息几乎告诉您缺少什么 您目前遇到的问题是,您是否缺少翻译单元中static InputHandler* s_pInstance;成员的定义。它应该是这样的:

InputHandler* InputHandler::s_pInstance = 0;

虽然你对单身模式的态度有一些缺陷和不足(特别是关于线程安全性)。您应该像这样简化singleton pattern

 static InputHandler& Instance() {
    static InputHandler theInputHandler;
    return theInputHandler; 
 }

或者如果你坚持使用指针

 static InputHandler* Instance() {
    static InputHandler theInputHandler;
    return &theInputHandler; 
 }

这通常被称为&#39; Scott Meyer的单身成语&#39; ,这里有关于原始推理的更多信息;

  

C++ and the Perils of Double-Checked Locking