为超类访问尚未定义的枚举类型

时间:2015-04-07 11:54:24

标签: c++ enums derived-class base-class

所以我有一个具有这些功能的基类A

virtual void DoSomething(SomeNameSpace1::EnumID ID) = 0;
virtual void DoSomething(SomeNameSpace2::EnumID ID) = 0;
virtual void DoSomething(SomeNameSpace3::EnumID ID) = 0;

我还有2个派生类BC,用于定义这些函数的工作方式。定义SomeNameSpace1::EnumIDSomeNameSpace2::EnumIDSomeNameSpace3::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::EnumIDSomeNameSpace2::EnumIDSomeNameSpace3::EnumID。包含enum_defn_b.hppenum_defn_c.hpp文件也没有意义,因为它们特定于两个派生类。在这种情况下我该怎么办?我读了一些关于前向声明的内容,但不确定这是否是正确的方法。

在派生类中,我会包含他们的.hpp enum_defn个文件,但基类呢?

2 个答案:

答案 0 :(得分:0)

您是否尝试使用由不同值引起的多态行为? 交换机箱不是更合适吗?也可以使用模板完成,但这些是pretty advanced topics

无论如何,这个解释可能会给你一些见解:

1)如果你想使用一个类型,应该在使用之前声明它。

2)派生类必须包含基类的声明,并隐式地包含枚举的定义。

3)如果每个派生类文件都以不同的方式定义其已存在名称的枚举,则会损害一个definition rule - C ++的基本概念之一。

答案 1 :(得分:0)

无论是否有任何B或C来源,A都应该有意义。除了它似乎不存在之外,应该怎么想SomeNameSpaceX?