我知道朋友课,我想要完全相反。
Ex:A类有一个名为F的公共函数。而其他30个类可以访问F函数,Z类无法访问F函数。
答案 0 :(得分:4)
如果该功能是公开的,则无法阻止他人来电。
你可以这样做,以便链接器不会在实现它的库之外导出该函数,但这就是它。
你实际试图解决什么问题?
答案 1 :(得分:1)
正如其他答案所述,您的公共界面无法对unfriend
或exclude
特定类进行处理。
虽然你可以使用相同的原则来拥有protected
接口,如本Q& A所述:
How can I remove/refactor a «friend» dependency declaration properly?
这将要求客户端实现特定接口以从提供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 ++示例。
答案 2 :(得分:0)
在我的头顶,我不认为这是可能的。您希望Z调用A :: F来生成编译错误吗?我不确定如何将该功能添加到某种语言中。如果确实存在这样的特征,则要么必须在A类中创建一个列表,其中包含可以使用或不能使用函数F的所有目标,或者您需要在其他类中指定它们不允许自己使用A :: F。
所以你想要像
这样的东西class Z {
denied A::F;
}
这可能是添加此类功能的最佳/最简单的方法,其中一些关键字意味着像上面一样使用。
我认为它不存在。像朋友这样的功能存在,因为添加可访问性对于通常无法访问的内容通常非常有用。很少有必要专门删除对您通常可以访问的内容的可访问性,编译器工程师的答案可能是"只是不要在Z中使用A :: F. #34;
不是说这个想法是愚蠢的,或者它没用,只是因为它没有用到成为一个功能,这就是为什么我不认为它是一个。