我有这样的情况:
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的头文件来打破封装。
如何在不重写相同代码的情况下解除内部的枚举定义,并将其作为外部公共枚举呈现?
答案 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的接口(如果我理解正确的话),那么为它添加一个纯基类,并在那里定义枚举。