Ошибка QNX - неопределенная ссылка на статическую переменную-член

Я использую QNX momemtics IDE 5.0.1 с виртуальной машиной VmPlayer для запуска клиента QNX. Я использую шаблон singleton для класса. При вызове экземпляра класса я получаю сообщение об ошибке «Неопределенная ссылка на ошибку: 'constexpr' необходима для внутриклассовой инициализации члена статических данных 'DemoClass* DemoClass::s_instance' неинтегрального типа [-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;
    }

}

Я вызываю функцию получения в другом классе, как показано ниже:

class AppMgr
{
DemoClass* m_demo;

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

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

Я добавил определение статического члена, все еще сталкивающегося с ошибкой. Пожалуйста, предложите.


person apb_developer    schedule 16.08.2016    source источник


Ответы (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();, определение конструктора/деструктора и т. д.

person karastojko    schedule 16.08.2016
comment
синтаксических ошибок не было в коде. Большое спасибо @karastojko. это помогло. - person apb_developer; 17.08.2016

Если у вас есть статическое поле в классе, вы можете инициализировать его на месте только в том случае, если оно имеет целочисленный тип или является constexpr. s_instance не является ни тем, ни другим, поэтому вам нужно разделить объявление и определение. Вам нужно определить s_instance вне области действия класса, в одном из ваших файлов C++, например:

Демокласс.h:

class DemoClass
{
    static DemoClass* s_instance;
}

ДемоКласс.C:

DemoClass *DemoClass::s_instance = nullptr;
person Jakub Zaverka    schedule 16.08.2016
comment
Спасибо за ваш вклад @Jakub. Это помогло - person apb_developer; 17.08.2016
comment
@apb_developer Если ваша проблема решена, вы можете пометить один из ответов как принятый. - person Jakub Zaverka; 17.08.2016