我有两个类,其中一个是另一个的子类。这些类被布置为一个单例。因此,基类包含一个静态成员,该成员被设置为该类的唯一实例,并且可以由getter函数引用(此处不相关,所以我省略了它)。我现在想在全局上下文中创建子类,并将实例保存到静态成员变量中。这基本上就是我所拥有的:
class LightBase
{
protected:
static LightBase instance_;
// .. stuff
}
class NormalLight0_5 : public LightBase
{
//.. other stuff
}
class NormalLight1_0 : public LightBase
{
//.. other stuff
}
#ifdef CONFIG_LIGHT_TYPE_NORMAL0_5
NormalLight0_5 LightBase::instance_(); // <-- my attempt to instantiate a light of type 0.5
#elif
NormalLight1_0 LightBase::instance_(); // <-- my attempt to instantiate a light of type 1.0
#endif
但我得到以下错误:
error: no declaration matches 'NormalLight1_0 LightBase::instance_()'
这是什么原因造成的?
多态性需要指针或引用。LightBase
成员只能存储LightBase
,而不能存储其子类之一。因此,问题并不在于定义,而是您的声明已经关闭。在任何情况下,定义都必须与声明匹配。
您可以使用std::unique_ptr
:
#include <memory>
class LightBase {
protected:
static std::unique_ptr<LightBase> instance_;
};
class NormalLight1_0 : public LightBase {};
std::unique_ptr<LightBase> LightBase::instance_ = std::make_unique<NormalLight1_0>();