【发布时间】:2020-08-16 18:45:34
【问题描述】:
我想执行以下操作(不会编译):
class Foo {
int value;
Foo(const int arg)
: value{arg}
{}
public:
static const Foo a{0};
static const Foo b{1};
static const Foo c{2};
Foo func(const Foo& foo) {...}
};
这样Foo 的实例受到严格控制(就像在enum 中一样),这样我就可以编写像auto foo = Foo::a; 和auto foo = Foo::a.func(Foo::b); 这样的代码
很遗憾,由于静态实例的类型不完整,因此代码无法在 C++11 下编译。
这个有成语吗?
【问题讨论】:
-
在 C++11 中
static成员必须单独定义。在您的班级static const Foo b;中,在您的 .cppFoo const Foo::b = 1;中。或者,C++17 为inline添加了一个新含义,让您可以在class中编写static inline const Foo b{1};,而无需单独定义。 -
这是不可能的,你不能创建一个类的实例(一个对象),直到类被完全定义(它是与关闭
})。也许如果你解释你试图用这个解决的实际问题,并解释为什么你不能使用枚举(“经典”或 C++11 强类型变体),我们也许可以帮你解决这个问题?