0

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

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

如果没有在 X 类中写出与 Y 类完全相同的 20 个函数,是否有任何更简单、更快捷的方法来授予用户对 20 个左右函数的访问权限(比如某种函数转发能力或其他东西)?

扩展说明:

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

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

4

1 回答 1

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()只返回 a的版本是完全不可取的,因为类客户端可以使用它来使用您想要阻止的方法修改您的对象。Y&XY

于 2012-08-09T10:03:49.660 回答