有没有一种方法可以使一个公共成员函数对某些类是私有的?我需要这样做的原因是因为一些类必须使用其他东西来代替公共成员函数,否则会有严重的bug,但无论如何都很容易忘记并这样做。示例:
class Location {
std::list<Person*> everyonePresent;
public:
const std::list<Person*>& getEveryonePresent() const {return everyonePresent;}
};
class DoSomething {
Person& person;
std::list<Person*> everyoneVisible;
public:
DoSomething(Person& p) : person(p), everyoneVisible(p.getLocation().getEveryonePresent()) {
// everyoneVisible now removes those who are hiding.
}
void execute() {
// ....
ApproachSomeone(person, everyoneVisible).execute();
// ...
}
};
现在ApproachSomeone::execute()
可能会在不应该使用person.getLocation().getEveryonePresent()
时意外使用它。但是Location::getEveryonePresent()
需要是公共的,因为它在很多地方都被使用,但是ApproachSomeone
是少数几个永远不能使用它的类之一。ApproachSomeone
是一个类,因为它在许多其他地方使用(命令模式)。
1条答案
按热度按时间drkbr07n1#
如果你愿意做一些依赖注入,或者愿意做一个类到抽象基类的显式转换以获得对私有成员函数的访问,那么有一种方法可以在每个函数的基础上对访问进行建模。
我曾经在一个类需要多个“朋友”的情况下使用过这些方法,但是这些朋友应该对不同的成员函数有不同的访问权限。做正确的事情仍然比较容易,但获得“私人”访问并非不可能。这是一个很好的折衷方案,可以检查代码中谁可以访问什么(因此也可以在代码审查中检测误用)。
现场演示:https://onlinegdb.com/TFVGm-HVW
首先,我们创建两个接口,用于每个类访问
class A
:然后,创建一个
class A
,它继承了两者,但保留了private
的实现。这对所有人隐藏了成员函数。然后,使用依赖注入:
class B
接收interface_for_class_b
class C
接收interface_for_class_c
下面是我们如何使用这些类: