Я использую 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();
}
Я добавил определение статического члена, который все еще сталкивается с ошибкой. Пожалуйста, предложите.
Помимо нескольких синтаксических ошибок, из-за которых образец не работает, необходимо объявить 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();
определение конструктора / деструктора и т. д.
Если у вас есть статическое поле в классе, вы можете инициализировать его на месте, только если оно имеет целочисленный тип или является constexpr
, s_instance
это ни то, ни другое, поэтому вам нужно разделить объявление и определение. Вам нужно определить s_instance
вне области класса, в одном из ваших файлов C ++, например:
DemoClass.h:
class DemoClass
{
static DemoClass* s_instance;
}
DemoClass.C:
DemoClass *DemoClass::s_instance = nullptr;