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

C++ 有没有一种方法可以防止在不使用友元类(C+;+;)的情况下从另一个类使用公共函数,c++,C++,我知道朋友班,我想要的正好相反 例:类A有一个名为F的公共函数。当其他30个类有权访问F函数时,类Z不能访问F函数。正如其他答案中提到的,没有办法从公共界面中取消某个类的友好关系或排除该类 尽管您可以使用与我相同的原则来保护接口,如本问答中所述: 这将需要客户端实现特定接口,以从提供受保护的接口的类调用函数: 这是C++实现: class ClassAAccessor { public: ClassAAccessor(ClassA& classA); void set

我知道朋友班,我想要的正好相反


例:类A有一个名为F的公共函数。当其他30个类有权访问F函数时,类Z不能访问F函数。

正如其他答案中提到的,没有办法从公共界面中取消某个类的友好关系或排除该类


尽管您可以使用与我相同的原则来保护接口,如本问答中所述:

这将需要客户端实现特定接口,以从提供
受保护的
接口的类调用函数:

这是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.
}
因此,
classaaaccessor
的构造函数可以按以下方式重写:

ClassAAccessor::ClassAAccessor(ClassA& classA)
: internalInterfaceRef(0) {
    classA.attachAccessor(*this);
}


<>我不想把你的问题标记成重复的,因为我的链接更多的是关于UML设计,但是包含了一个C++示例。

< P>其他答案中提到的,没有办法从你的公共接口中找到<代码> unFule<代码>或<代码>排除< /Cuff>一个特定类。
尽管您可以使用与我相同的原则来保护接口,如本问答中所述:

这将需要客户端实现特定接口,以从提供
受保护的
接口的类调用函数:

这是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.
}
因此,
classaaaccessor
的构造函数可以按以下方式重写:

ClassAAccessor::ClassAAccessor(ClassA& classA)
: internalInterfaceRef(0) {
    classA.attachAccessor(*this);
}


<>我不想把你的问题标记成重复的,因为我的链接更多的是关于UML设计,但是包含了一个C++示例。

如果函数是公共的,你不能阻止别人调用它。 您可以使函数不被链接器导出到实现它的库之外,但仅此而已


您实际上想解决什么问题?

如果该函数是公共函数,您无法阻止其他人调用它

您可以使函数不被链接器导出到实现它的库之外,但仅此而已


你到底想解决什么问题?

我不知道,我认为那是不可能的。您希望Z调用A::F来生成编译错误吗?我甚至不知道你会如何将这个特性添加到一种语言中。如果确实存在这样一个功能,那么要么您必须在类a中创建一个列表,其中包含可以或不能使用函数F的所有目标,要么您需要在其他类中指定它们不允许自己使用a::F

所以你想要像这样的东西

class Z {
    denied A::F;
}
这可能是添加这样一个功能的最好/最简单的方法,其中包含一些类似于上面所述的关键字

我认为它不存在。像friend这样的功能之所以存在,是因为它通常非常有用,可以为您通常无法访问的内容添加可访问性。很少有必要专门删除您通常可以访问的内容的可访问性,编译器工程师的答案可能是“不要在Z中使用A::F”


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

我不认为这是可能的。您希望Z调用A::F来生成编译错误吗?我甚至不知道你会如何将这个特性添加到一种语言中。如果确实存在这样一个功能,那么要么您必须在类a中创建一个列表,其中包含可以或不能使用函数F的所有目标,要么您需要在其他类中指定它们不允许自己使用a::F

所以你想要像这样的东西

class Z {
    denied A::F;
}
这可能是添加这样一个功能的最好/最简单的方法,其中包含一些类似于上面所述的关键字

我认为它不存在。像friend这样的功能之所以存在,是因为它通常非常有用,可以为您通常无法访问的内容添加可访问性。很少有必要专门删除您通常可以访问的内容的可访问性,编译器工程师的答案可能是“不要在Z中使用A::F”


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

那么Z的子对象和它创建的对象的类呢?那些人能进入F吗?是什么阻止Z简单地构造一个代理来访问F?这似乎是一个XY问题。如果某些类不应该访问某个函数,那么它应该是受保护的/私有的,并且它应该
friend
需要访问的类。这就是该功能存在的目的。@MooingDuck实际上有办法重构
朋友关系。看看我的(链接的)答案。@Z的jaggedSpire派生类对于我的例子来说并不重要。为什么我要构造对F函数的代理访问,我想阻止从Z类访问F函数。@我的观点是,即使有一种简单、优雅的方法阻止从单个类访问,也很容易绕过,因此在类内无法提供可靠的访问保护。阻止对单个类的访问比其他任何事情都更像是一场表演——它不会阻止在
Z
的成员函数中调用任何东西。如果您想阻止访问某些公共函数子集,请创建一个只提供对相关函数的访问的访问包装器类,并将其传递给Revevant