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

Is there a way to prevent a public function being used from another class without using Friend classes (C++)

本文关键字:情况下 另一个 函数 C++ 有没有 友元      更新时间:2023-10-16

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

例如:类 A 有一个名为 F 的公共函数。虽然其他 30 个类可以访问 F 函数,但 Z 类无法访问 F 函数。

如果函数是公共的,则无法阻止其他人调用它。

您可以这样做,以便链接器不会将函数导出到实现它的库之外,但仅此而已。

到底想解决什么问题?

正如其他答案中提到的,没有办法从公共接口unfriendexclude特定的类。


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

并不是说这个想法是愚蠢的或无用的,只是说它不够有用,无法成为一个功能,这就是为什么我认为它不是一个。

相关文章: