如何公开大型受保护的内部类函数组?

时间:2012-08-09 09:40:15

标签: c++ class

假设我有自己构建的类(我不会引用一个例子,因为长度)X,并且在受保护的部分中,有一个类Y(来自外部库我无法修改,并且不能使用该类的继承因为成员定义是隐藏的。)

Y类有大约40个功能。其中20个我不希望用户能够访问或修改,因为它会导致功能损坏(当前在X类中受到保护状态阻止),但是我希望用户能够访问的其他20个功能因此修改Y类(几乎,好像它们有直接访问权减去所谓的'危险'功能)。

如果没有在X类中写出20个与Y类完全相同的函数,是否有更简单,更快捷的方式来授予用户访问20个左右的函数(比如某种函数转发能力等)? / p>

扩展说明:

这有点棘手,因为有一个库函数需要一个Y类(但是不会接受类X,并且人们抱怨我在类之间进行转换)。类X应该为类Y的操作自动化和存储信息,能够返回函数的(const)类Y ,并允许用户修改简单的东西(例如对象的位置) )但不是自动化的东西(图像,图像循环)。

类X是一种类Y类在自动化函数中工作但不允许类X返回类Y(不能引用自身,类Y的修改版本,再次,人们会抱怨我在类之间进行铸造)。

1 个答案:

答案 0 :(得分:4)

为什么你不能从班级Y继承?如果你可以使用它,你可以继承它。

您可以使用非公共继承(可能是私有继承)解决您的问题,然后通过Y声明从using解除您想要的功能:

class Y
{
public:
  void FunctionIWantToExpose();
  void AnotherFunctionIWantToExpose();
  void FunctionIDontWantToExpose();
}

class X : private Y
{
public:
  using Y::FunctionIWantToExpose;
  using Y::AnotherFunctionIWantToExpose;
}

int main()
{
  X x;
  x.FunctionIWantToExpose(); // This is legal and calls Y::FunctionIWantToExpose()
  x.FunctionIDontWantToExpose(); // This will cause a compile error
  return 0;
}

编辑:如果您想提供对内部Y对象的访问权限,可以使用X中的其他成员函数轻松完成:

const Y& GetY() const
{
  return *this;
}

这适用于类X,因为可以在那里访问基类Y。另一方面,只返回GetY()的{​​{1}}版本是完全不可取的,因为类客户端可以使用它来使用Y&方法修改X个对象想阻止。