【问题标题】:QNX error - "Undefined reference to" for static member variableQNX 错误 - 静态成员变量的“未定义引用”
【发布时间】:2016-08-16 07:15:16
【问题描述】:

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

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();
}

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

【问题讨论】:

    标签: c++ c++11 static singleton qnx-neutrino


    【解决方案1】:

    除了一些导致示例无法工作的语法错误之外,您需要在类之外声明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();、构造函数/析构函数定义等。

    【讨论】:

    • 代码中没有语法错误。非常感谢@karastojko。它有帮助。
    【解决方案2】:

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

    DemoClass.h:

    class DemoClass
    {
        static DemoClass* s_instance;
    }
    

    DemoClass.C:

    DemoClass *DemoClass::s_instance = nullptr;
    

    【讨论】:

    • 感谢您的意见@Jakub。它有帮助
    • @apb_developer 如果您的问题得到解决,您可以将其中一个答案标记为已接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2014-02-17
    • 2021-03-21
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多