所以我有一个具有这些功能的基类A
:
virtual void DoSomething(SomeNameSpace1::EnumID ID) = 0;
virtual void DoSomething(SomeNameSpace2::EnumID ID) = 0;
virtual void DoSomething(SomeNameSpace3::EnumID ID) = 0;
我还有2个派生类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
个文件,但基类呢?
答案 0 :(得分:0)
您是否尝试使用由不同值引起的多态行为? 交换机箱不是更合适吗?也可以使用模板完成,但这些是pretty advanced topics。
无论如何,这个解释可能会给你一些见解:
1)如果你想使用一个类型,应该在使用之前声明它。
2)派生类必须包含基类的声明,并隐式地包含枚举的定义。
3)如果每个派生类文件都以不同的方式定义其已存在名称的枚举,则会损害一个definition rule - C ++的基本概念之一。
答案 1 :(得分:0)
无论是否有任何B或C来源,A都应该有意义。除了它似乎不存在之外,应该怎么想SomeNameSpaceX?