C++ 如何公开大量受保护的内部类函数?

C++ 如何公开大量受保护的内部类函数?,c++,class,C++,Class,假设我有自己构建的类(由于长度原因,我不会引用示例)X,并且在受保护的部分中,有一个类Y(来自外部库,我无法修改,并且由于成员定义被隐藏,因此无法使用该类的继承) Y类有大约40个功能。我不希望用户能够访问或修改其中的20个功能,因为这会导致功能中断(目前由X类中的受保护状态阻止),但我希望用户能够访问并因此修改Y类的其他20个功能(几乎就好像他们拥有直接访问权限减去所谓的“危险”功能一样) 如果不在类X中写出20个与类Y完全相同的函数,是否有更简单、更快的方法授予用户访问20个左右函数的权限(

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

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

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

扩展注释:

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


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

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

您可以使用非公共继承(可能是私有继承)来解决问题,然后通过
使用
声明从
Y
中提升所需的函数:

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

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

您可以使用非公共继承(可能是私有继承)来解决问题,然后通过
使用
声明从
Y
中提升所需的函数:

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

如果,我会将Y公开,并制作一个很好的文档,告诉他们应该使用哪些函数,不应该使用哪些函数。但是,我更像是一个C程序员……如果我是这样的话,我会将Y公开,并制作一个很好的文档,告诉他们应该使用哪些函数,不应该使用哪些函数。但是,我更像是一个C程序员……如果我想返回类Y本身(例如,const&Y GetY()const),我将如何使用继承来实现这一点?
const Y&GetY()const{return static_cast(*this);}
应该做到这一点,至少只要
X
不从任何其他类继承。@j\u random\u hacker:我认为
static\u cast
可以在这里工作,但我准备接受更正。我也不喜欢这个
GetY()
函数,而且对这些类型转换感到不太舒服。@j\u random\u hacker:我明白了,但我认为只有在类外
X
才是这样。在它里面(例如,在
X::GetY()
的实现中,你实际上可以做
静态的
,它会工作的。毕竟,在
X
里面,
X
继承自
Y
@j\u random\u hacker:哦,总是把事情过度复杂化:)事实上,没有一个强制转换总是比任何强制转换好得多。我正在用最终版本更新我的答案。如果我想返回类Y本身(例如,const&Y GetY()const),我将如何使用继承来实现这一点?
const Y&GetY()const{return static_cast(*this);}
应该做到这一点,至少只要
X
不从任何其他类继承。@j\u random\u hacker:我认为
static\u cast
可以在这里工作,但我准备接受更正。我也不喜欢这个
GetY()
函数,而且对这些类型转换感到不太舒服。@j\u random\u hacker:我明白了,但我认为只有在类外
X
才是这样。在它里面(例如,在
X::GetY()
的实现中,你实际上可以做
静态的
,它会工作的。毕竟,在
X
里面,
X
继承自
Y
@j\u random\u hacker:哦,总是把事情过度复杂化:)事实上,没有一个强制转换总是比任何强制转换好得多。我正在用最终版本更新我的答案。