为超类提供对尚未定义的枚举类型的访问权限
Giving a superclass access to enum types that have not been defined yet
所以我有一个基类A
,它具有以下函数:
virtual void DoSomething(SomeNameSpace1::EnumID ID) = 0;
virtual void DoSomething(SomeNameSpace2::EnumID ID) = 0;
virtual void DoSomething(SomeNameSpace3::EnumID ID) = 0;
我还有两个派生类B
和C
,它们定义了这些函数的工作方式。SomeNameSpace1::EnumID
、SomeNameSpace2::EnumID
和SomeNameSpace3::EnumID
的定义方式取决于它是否在类B
或类C
中使用。因此,我有两个文件:
enum_defn_B.hpp:
namespace SomeNameSpace1 {
enum EnumID {
ENUM_TYPE_1 = 0 ,
ENUM_TYPE_2
}
namespace SomeNameSpace2 {
enum EnumID {
ENUM_TYPE_3 = 0 ,
ENUM_TYPE_4
}
namespace SomeNameSpace3 {
enum EnumID {
ENUM_TYPE_5 = 0 ,
ENUM_TYPE_6
}
enum_defn_C.hpp:
namespace SomeNameSpace1 {
enum EnumID {
ENUM_TYPE_7 = 0 ,
ENUM_TYPE_8
}
namespace SomeNameSpace2 {
enum EnumID {
ENUM_TYPE_9 = 0 ,
ENUM_TYPE_10
}
namespace SomeNameSpace3 {
enum EnumID {
ENUM_TYPE_11 = 0 ,
ENUM_TYPE_12
}
我现在遇到的问题是基类A
不能识别类型SomeNameSpace1::EnumID
、SomeNameSpace2::EnumID
或SomeNameSpace3::EnumID
。包含enum_defn_b.hpp
或enum_defn_c.hpp
文件也是没有意义的,因为它们是两个派生类所特有的。这种情况下我该怎么办?我读了一些关于正向声明的东西,但不确定这是否是正确的方法。
在派生类中,我会包括它们的每个.hpp
enum_defn
文件,但基类呢?
您是否试图使用由不同值引起的多态行为?开关箱不是更合适吗?它也可以使用模板来完成,但这些都是非常高级的主题。
无论如何,也许这个解释会给你一些启示:
1) 如果要使用类型,则应在使用前对其进行声明。
2) 派生类必须包含基类的声明,并隐式地包含枚举的定义。
3) 如果每个派生类文件都以不同的方式用已经存在的名称定义其枚举,这将损害一个定义规则——C++的基本概念之一。
A应该是有意义的,无论是否有任何Bs或Cs派生自它。除了它似乎不存在之外,A应该怎么看待SomeNameSpaceX?
相关文章:
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- 如何注册枚举类型到QJSEngine,以便在脚本环境中使用?
- 通过包装器从 C 访问C++ API 时,如何访问枚举类型
- C++/错误:表达式必须具有整数或无作用域枚举类型
- 如何理解c++中在命名空间内部定义的枚举类型enum
- 在类访问混淆中声明的枚举类型
- 在枚举类型上使用std::max是不是一种糟糕的做法
- C++ 在方程中使用变量;错误:表达式必须具有整数或无作用域枚举类型及其他
- 是否可以使用泛型枚举类型作为函数的参数?
- Visual Studio 2017 生成工具与枚举类型的问题
- 使用枚举类型管理存储顺序
- 如何检查类中定义的枚举类型变量是否被分配给?
- 如何从枚举类型中获取枚举值?
- 为什么C++不为枚举类型提供默认"operator>>"函数?
- 确保枚举类型的键/值在软件Revs之间永远不会更改
- MSVC 1 位枚举类型等于 -1,并且相等性测试失败
- 我们可以专业化类模板的枚举(类型)成员吗?
- 错误:以增量方式填充向量时,表达式必须具有整数或无作用域枚举类型
- 枚举类型的重载>>运算符(工作日)
- C 中的枚举类型字符串类别