我一直在将代码从我的项目移动到静态库。最近,我将命令系统移动到静态库,但是留下了事件,因为它们是特定于项目的。但是,我在命令构造函数中使用的一个事件是默认值。我最终做的是使用构造函数定义此事件,然后允许原始项目重新定义此命令并定义其余事件。
静态库:*
namespace Event
{
enum Type
{
None = 0
};
}
Command::Command()
: fcn()
, event(Event::None)
{
}
原创项目:
namespace Event
{
enum Type
{
None = 0,
Enemey = 1 << 0,
Player = 1 << 1,
}
}
故意以这种方式重新定义枚举是一个糟糕的设计选择吗?
答案 0 :(得分:1)
这在C ++中是非法的,因为它违反了一个定义规则(ODR)。例如,编译器可以基于其内容为枚举选择合理的字节宽度。如果一个声明只有一个值而且它是0,而另一个声明有很多可能很大的值,那么你最终会得到两个不同的(不兼容的)概念,即这个枚举类型的宽度。这不会起作用,并且违反了语言要求。
您可能会考虑让库采用某种类型的普通整数(例如uint32_t或uint64_t),使用0作为默认值,只是让枚举值对库不透明(它们必须是无论如何,因为库已经有了不知道零以外的任何其他值。