c++ - 从包装类公开内部类的公共(public)枚举

标签 c++ oop enums inner-classes

我有这样的情况:

class Inner
{
public:
    enum myEnum;
    myEnum getInnerEnumValue();
};

class Outer
{
private:
    Inner myInner;
public
    Inner::myEnum getOuterEnumValue()
    {
        return myInner.getInnerEnumValue();
    }
};

Inner 类是围绕硬件 API 的相当低级别的包装器,而 Outer 类是一个额外的层,用于为某些功能提供更好的接口(interface)并在不同的数据结构之间进行转换。我希望外界使用 Outer 而忘记 Inner。

但是,Inner 定义了一个枚举和一个 getter 方法,这正是我获取某条信息所需要的。我想将此枚举用作 Outer 的返回类型,直接将其传递。但是,如果我如上所示声明 getEnumValue() 函数,我就会通过让外部世界包含 Inner 的头文件来打破封装。

如何在不重写相同代码的情况下从 Inner 提取枚举定义,并将其呈现为 Outer 的公共(public)枚举?

最佳答案

我建议只在您的外部类中提供一个 typedef。像这样的东西:

class Outer {
public:
    typedef Inner::myEnum myEnum;

    myEnum getInnerEnumValue();
};

或者,您可以使用私有(private)继承(这可能会更好一些):

class Outer : private Inner {
public:
    using Inner::myEnum;

    myEnum getInnerEnumValue();
};

至少这样,您的类的消费者不会直接依赖于内部类。将来您可以自由地将 typedef 替换为您自己的枚举(如有必要)。消费者仍然必须包含内部类头文件,但没有办法解决这个问题。

关于c++ - 从包装类公开内部类的公共(public)枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7001285/

相关文章:

c++ - 类是保存此数据 C++ 的最佳方式吗?

c++ - 引用静态对象 - 在 ARM proc 上触发对齐陷阱

c++ - 如何在控制台窗口打印这个字 "☻"?(c/c++)

Objective C 中类似 Java 的接口(interface)

Java - 子类型枚举或子类

python - 是否可以在 Enum 中定义类常量?

c++ - Xcode:如何在 i7 上为旧版 Intel 处理器(i5、Core 2 Duo)构建

c# - 继承和接口(interface) .NET

javascript - jQuery 使用动态命名的特定对象

java - 随机枚举返回 null