具有重载访问器函数的单例上的 C++ 未解析外部

C++ Unresolved External on Singleton Having Overloaded Accessor Function

我的 C++ 程序中出现未解决的外部符号错误。我在下面提供了一个 MCVE。

Foo class 的构造函数需要一个 int 参数。我希望 Foo 成为一个单例对象。

Foo class 中,我创建了两个访问函数来检索指向单例对象的指针。第一个传递 int 参数以允许构造对象。第二个不需要参数,以允许不知道参数的代码访问对象。

尝试在 main() 中创建 Foo 的实例时,错误发生在 link。

有没有更好的方法来做到这一点,最重要的是为了避免错误,并且(不太重要)所以 Foo 接口不会强加第二个访问者可能不是的不幸要求在第一个之前打电话?

#include <assert.h>

class Foo {
public:
    // Accessor function initializes m_param, and
    // returns pointer to singleton.
    static Foo* GetInstance (int *param)
    {
        // Foo singleton object is instantiated on first call
        // to this function
        static Foo instance (param);
        pInstance = &instance;
        return pInstance;
    }

    // Overloaded version of GetInstance() that may be called
    // after first calling static Foo* GetInstance(int *param).
    static Foo* GetInstance ()
    {
        // This alerts us if the other GetInstance() was not called first.
        assert (pInstance);

        return pInstance;
    }

private:
    // constructor
    Foo (int *param)
        : m_param (*param)
    {}

    // private var
    int m_param;

    // pointer to singleton object
    static Foo* pInstance;
};

// initialize static var
Foo* pInstance = static_cast<Foo*>(nullptr);


int main(int argc, char* argv[])
{
    int pInt;
    Foo* pFoo = Foo::GetInstance (&pInt);
    return 0;
}

要修复 link 错误,请更改

Foo* pInstance = static_cast<Foo*>(nullptr);

Foo* Foo::pInstance = static_cast<Foo*>(nullptr);

或更好:

Foo* Foo::pInstance = nullptr;

检查 this link 以获得深入的解释

See this 深入讨论使用单例模式的最佳方式: