0

我正在使用带有虚拟机 VmPlayer 的 QNX momemtics IDE 5.0.1 来运行 QNX 客户端。我在课堂上使用单例模式。调用类的实例时,我收到错误“未定义的引用”错误:类内初始化非整数类型的静态数据成员“DemoClass * DemoClass :: s_instance”所需的“constexpr” [-fpermissive]” . 代码片段如下:

class DemoClass
{
   static DemoClass*s_instance = nullptr;
   public :
        DemoClass();
    virtual ~DemoClass();

    //singleton 
    static DemoClass* GetInstance()
    {
        if (!s_instance)
          s_instance = new DemoClass;
        return s_instance;
    }

}

我在另一个类中调用 getter 函数,如下所示:

class AppMgr
{
DemoClass* m_demo;

public:
    AppMgr();
    virtual ~AppMgr();
    void Load();
);

void AppMgr::Load()
{
   m_demo = = DemoClass::GetInstance();
}

我添加了仍然面临错误的静态成员的定义。请建议。

4

2 回答 2

2

除了使示例无法正常工作的一些语法错误之外,您还需要s_instance在类之外声明,因为它是静态的:

class DemoClass
{
    static DemoClass* s_instance;

public :
    DemoClass();
    virtual ~DemoClass();

    //singleton 
    static DemoClass* GetInstance()
    {
        if (!s_instance)
        s_instance = new DemoClass;
        return s_instance;
    }

};

DemoClass* DemoClass::s_instance = nullptr;

这修复了提到的错误,还有更多需要修复m_demo = = DemoClass::GetInstance();,例如构造函数/析构函数定义等。

于 2016-08-16T07:23:18.503 回答
1

如果你在一个类中有一个静态字段,你只能在它是整数类型的 const 或者它是一个constexpr. s_instance两者都不是,因此您需要将声明和定义分开。您需要s_instance在类的范围之外,在您的 C++ 文件之一中定义,例如:

演示类.h:

class DemoClass
{
    static DemoClass* s_instance;
}

演示类.C:

DemoClass *DemoClass::s_instance = nullptr;
于 2016-08-16T07:52:02.097 回答