【发布时间】:2013-11-24 18:23:00
【问题描述】:
在这些论坛上有几个关于 C++ 枚举继承以进行扩展的问题(这实际上是没有逻辑的事情)。但是仅用于设置特定值的继承呢? 目前,我的代码中有如下内容:
//lib_impl.h
enum class X {
a = 13, // these values are
b = 42 // implementation dependent
}
//lib.h
#include "lib_impl.h"
void some_func(X param) {
X x = X::a;
}
我只是想避免“lib”在其实现中的依赖性。可能,必须使用除枚举之外的其他东西。即使在 C++11 中,我们也只能声明前向枚举名称,但不能声明其枚举数:
//lib.h
enum class X { a, b } // this is both declaration and definition, unfortunately
void some_func(X param) {
X x = X::a;
}
//lib_impl.h
#include "lib.h"
enum class X { // redefenition, compilation error
a = 13,
b = 42
}
此类问题的最佳编译时解决方案是什么?
--
由于在 c++ 中似乎无法实现,解决此类问题的最常见方法是什么?将“lib”对“impl”的依赖保留原样?可能,“impl”可以分为两部分,小的部分将包含在“lib.h”之前,而其他较大的部分将包含在它之后。可以还是我需要放弃使用枚举来支持抽象类?
【问题讨论】:
-
编译器应该如何为
some_func生成代码?X::a是编译时常量,在这种情况下,编译器需要以一种或另一种方式查看实际值。否则它是一个占用空间的变量,在这种情况下,编译器将生成用于从该空间加载值的代码。你可以实现后者,我将X设为一个实际的类,将a设为它的静态成员。 -
静态函数不能是虚函数,可以吗?
-
不,他们不可能。虽然我很难看出这一事实与手头问题的相关性。
标签: c++ inheritance c++11 enums