有没有办法防止在不使用Friend类的情况下从另一个类中使用公共函数(C ++)

时间:2016-07-13 16:57:17

标签: c++

我知道朋友课,我想要完全相反。

Ex:A类有一个名为F的公共函数。而其他30个类可以访问F函数,Z类无法访问F函数。

3 个答案:

答案 0 :(得分:4)

如果该功能是公开的,则无法阻止他人来电。

你可以这样做,以便链接器不会在实现它的库之外导出该函数,但这就是它。

实际试图解决什么问题?

答案 1 :(得分:1)

正如其他答案所述,您的公共界面无法对unfriendexclude特定类进行处理。

虽然你可以使用相同的原则来拥有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;

不是说这个想法是愚蠢的,或者它没用,只是因为它没有用到成为一个功能,这就是为什么我不认为它是一个。