从包装类中公开内部类的公共枚举

时间:2011-08-09 18:47:00

标签: 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类是一个额外的层,可以为某些功能提供更好的接口,并在不同的数据结构之间进行转换。我希望外面的世界使用Outer而忘记Inner。

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

如何在不重写相同代码的情况下解除内部的枚举定义,并将其作为外部公共枚举呈现?

2 个答案:

答案 0 :(得分:2)

我建议你在外层提供一个typedef。类似的东西:

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

    myEnum getInnerEnumValue();
};

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

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

    myEnum getInnerEnumValue();
};

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

答案 1 :(得分:0)

将枚举从class Inner移出到新的头文件中(甚至可能是单独的命名空间)

修改

因为你想保留Inner的接口(如果我理解正确的话),那么为它添加一个纯基类,并在那里定义枚举。