Ошибка QNX — & quot; Неопределенная ссылка на & quot; для статической переменной-члена

Я использую QNX momemtics IDE 5.0.1 с виртуальной машиной VmPlayer для запуска QNX Client. Я использую шаблон синглтона для класса. При вызове экземпляра класса я получаю сообщение об ошибке «Неопределенная ссылка на» error: ‘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();
}

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

0

Решение

Помимо нескольких синтаксических ошибок, из-за которых образец не работает, необходимо объявить 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();определение конструктора / деструктора и т. д.

2

Другие решения

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

DemoClass.h:

class DemoClass
{
static DemoClass* s_instance;
}

DemoClass.C:

DemoClass *DemoClass::s_instance = nullptr;
1

По вопросам рекламы [email protected]