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

C++ Unresolved External on Singleton Having Overloaded Accessor Function

本文关键字:C++ 上的 外部 Singleton 重载 访问 函数      更新时间:2023-10-16

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

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

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

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

有没有更好的方法可以做到这一点,最重要的是为了避免错误,(不太重要的是)为了使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;
}

要修复链接错误,请更改

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

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

或者更好:

Foo* Foo::pInstance = nullptr;

查看此链接以获得深入的解释

有关使用Singleton模式的最佳方法的深入讨论,请参阅本文: