考虑以下枚举声明:
enum Foo { Bar, Baz, Qux };
现在考虑我希望枚举器(Bar,Baz和Qux)具有某些值。我可以通过简单地在声明中初始化它来解决这个问题:
enum Foo { Bar = 4, Baz = 2, Qux = 42 };
现在,如果我不希望知道这些值,该怎么办?例如,当使用来自其他库的其他预定义值时,或者对两个枚举器使用相同的值时。例子:
enum Foo { Bar = MY_LIB_BAR, Baz = MY_LIB_BAZ, Qux = MY_LIB_QUX };
enum Foo { Bar = 0, Baz = 42, Qux = 0 };
我尝试过这样的事情:
// In header
enum Foo { Bar, Baz, Qux };
// In source
Foo { Bar = 0, Baz = 42, Qux = 0 };
// ...or...
Foo::Bar = 0, Foo::Baz = 42, Foo::Qux = 0;
显然,我的尝试都没有奏效。
所以,我的问题如下:有没有办法在声明之外初始化枚举器?如果是这样,如何做,例如在相应的.cpp源文件中?
编辑:我可以指定枚举的基础类型。考虑到C ++ 11允许前向声明,我认为我的问题可以解决,因为枚举成为一个完整的类型。
答案 0 :(得分:1)
这是不可能的。原因很简单,例如,枚举通常用于switch
语句中。对于这些语句,必须在编译时知道常量。如果你可以在标题中省略它们,那么编译器将无法编译另一个ocmpilation单元中的任何switch
,因为它无法访问这些值。
同样适用于所有constexpr
:它们必须在声明它们的地方定义,原因完全相同:编译器必须始终知道它们的值。
如果你真的需要隐藏int
常数,那么只需将它们定义为通常的常量,例如:
Foo.hpp:
class Foo {
static const int Bar;
static const int Baz;
static const int Qux;
}
Foo.cpp中:
const int Foo::Bar = 47;
const int Foo::Baz = 11;
const int Foo::Qux = 4711;
当然,您无法在switch
语句中使用这些常量!
我可以指定枚举的基础类型。考虑到这一点 C ++ 11允许前向声明,我认为我的问题可能是 解决了,因为枚举变成了一个完整的类型。
这根本没有用!即使在C ++ 11和C ++ 14中,枚举常量的前向声明也是不可能的。
答案 1 :(得分:0)
没有办法 - 枚举始终将初始化程序作为枚举声明的一部分,并且不能将它们拆分为.cpp文件。它与C ++ 11类型的枚举相同。
答案 2 :(得分:0)
枚举是在编译时计算的常量值,因此您可以像许多其他类型一样将其拆分为声明和定义。枚举声明也必须是它的定义,所以当你声明它时,你需要它完整的值。
答案 3 :(得分:0)
枚举类型是设计意图的有限集。