初始化 class 的静态成员,它本身就是 subclass 中的 class
Initialize static member of class which is itself a class in subclass
我有两个 class,其中一个是另一个的子class。 classes 被布置为单例。所以基础 class 包含一个静态成员,它被设置为 class 的唯一实例并且可以被 getter 函数引用(这里不相关,所以我把它省略了) .我现在想在全局上下文中创建 subclass 并将实例保存到静态成员变量。这基本上就是我所拥有的:
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>();
我有两个 class,其中一个是另一个的子class。 classes 被布置为单例。所以基础 class 包含一个静态成员,它被设置为 class 的唯一实例并且可以被 getter 函数引用(这里不相关,所以我把它省略了) .我现在想在全局上下文中创建 subclass 并将实例保存到静态成员变量。这基本上就是我所拥有的:
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>();