为超类提供对尚未定义的枚举类型的访问权限

Giving a superclass access to enum types that have not been defined yet

本文关键字:枚举 类型 访问权 权限 访问 未定义 超类      更新时间:2023-10-16

所以我有一个基类A,它具有以下函数:

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

我还有两个派生类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文件也是没有意义的,因为它们是两个派生类所特有的。这种情况下我该怎么办?我读了一些关于正向声明的东西,但不确定这是否是正确的方法。

在派生类中,我会包括它们的每个.hppenum_defn文件,但基类呢?

您是否试图使用由不同值引起的多态行为?开关箱不是更合适吗?它也可以使用模板来完成,但这些都是非常高级的主题。

无论如何,也许这个解释会给你一些启示:

1) 如果要使用类型,则应在使用前对其进行声明。

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

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

A应该是有意义的,无论是否有任何Bs或Cs派生自它。除了它似乎不存在之外,A应该怎么看待SomeNameSpaceX?