有没有办法防止在不使用友元类 (C++) 的情况下从另一个类使用公共函数
Is there a way to prevent a public function being used from another class without using Friend classes (C++)
我知道朋友类,我想要完全相反的类。
例如:类 A 有一个名为 F 的公共函数。虽然其他 30 个类可以访问 F 函数,但 Z 类无法访问 F 函数。
如果函数是公共的,则无法阻止其他人调用它。
您可以这样做,以便链接器不会将函数导出到实现它的库之外,但仅此而已。
你到底想解决什么问题?
正如其他答案中提到的,没有办法从公共接口unfriend
或exclude
特定的类。
虽然你可以使用相同的原理来拥有protected
接口,如本问答中所述:
如何正确删除/重构"朋友"依赖项声明?
这将要求客户端实现一个特定的接口,以从提供protected
接口的类调用函数:
下面是C++实现:
class ClassAAccessor { public: ClassAAccessor(ClassA& classA); void setInternalInterfaceRef(InternalInterface & newValue) { internalInterfaceRef = &newValue; } private: InternalInterface* internalInterfaceRef; };
当调用同样新引入的方法
ClassA::attachAccessor()
方法时,实际上调用了这个方法:class ClassA : protected InternalInterface { public: // ... attachAccessor(ClassAAccessor & accessor); // ... }; ClassA::attachAccessor(ClassAAccessor & accessor) { accessor.setInternalInterfaceRef(*this); // The internal interface can be handed // out here only, since it's inherited // in the protected scope. }
因此,可以通过以下方式重写
ClassAAccessor
的构造函数:ClassAAccessor::ClassAAccessor(ClassA& classA) : internalInterfaceRef(0) { classA.attachAccessor(*this); }
我不想将您的问题标记为重复,因为我链接的答案更多是关于 UML 设计,但包含一个 c++ 示例。
在我的头顶上,我认为这是不可能的。您希望对 A::F 的 Z 调用生成编译错误?我不确定您如何将该功能添加到语言中。如果确实存在这样的功能,那么要么你必须在类 A 中创建一个列表,其中包含所有可以使用或不能使用函数 F 的目标,要么你需要在其他类中指定它们不允许自己使用 A::F。
所以你想要类似的东西
class Z {
denied A::F;
}
这可能是添加此类功能的最佳/最简单的方法,一些关键字旨在像上面一样使用。
我认为它不存在。像朋友这样的功能存在,因为添加通常无法访问的可访问性通常非常有用。很少需要专门删除通常可以访问的内容的可访问性,编译器工程师的答案可能是"只是不要在 Z 中使用 A::F"。
并不是说这个想法是愚蠢的或无用的,只是说它不够有用,无法成为一个功能,这就是为什么我认为它不是一个。
- 为什么我可以在不重载 "=" 运算符的情况下将一个对象分配给另一个对象?
- 如何在不复制的情况下将一个向量移动到另一个向量中
- C++在不使用pow或循环的情况下计算一个数字的幂
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 在C++中,有没有一种方法可以让我在不传递参数的情况下拥有一个函数
- 是否可以在不扩展初始宏的情况下将一个宏作为参数提供给另一个宏?
- 父类有 26 个构造函数重载.如何在不复制+粘贴 26 个重载的情况下将一个小任务附加到所有构造器?
- 有什么理由在没有继承的情况下声明一个虚拟方法
- 如何在给定任意数量的整数的情况下创建一个唯一键?并使用该键存储,然后从地图中查找
- 如何在不使用数学的情况下知道一个数字是否是回文
- 如何使您的程序重复递增,直到在switch语句中按下另一个键
- 在不复制变量的情况下列出一个变量
- wxWidgets:如何在不将控制权传递给它的情况下制作一个 GUI
- 如何在<string>没有 std::string 中介的情况下制作一个支持通过 C 字符串查找的集合?
- 有没有办法在不知道它的大小的情况下制作一个字符数组
- 我想在不使用字符串的情况下声明一个指向字符的指针数组
- 如何在不把内部类的定义放入父类的情况下创建一个内部类
- Boost::在gcc4.6不工作的情况下分配一个大映射的静态初始化
- 我怎样才能在不出错的情况下保存一个unsigned long
- 如何在不使用平方根的情况下检查一个整数是否是完全平方数