在我当前的项目中,我试图将私有成员函数作为参数传递给另一个函数。在我的代码中,另一个函数是不同类的成员函数,但为了保持简单,这里它是一个自由函数。
void outside_function(std::function<void(int)> func) {
// do something with func
}
class MyClass {
public:
void run();
private:
bool my_func(double); // defined in source file
};
现在,从run
内部我想将my_func
放入outside_function
作为参数。由于run
的签名不符合参数的要求,我不能简单地通过它。使用adapter pattern是我的第一次尝试,当我被提醒时,成员函数隐式地将this
指针作为第一个参数。 This回答建议使用lambda表达式,这就是我所做的。
void MyClass::run() {
outside_function([this](int a) -> void {
double d = static_cast<double>(a);
this->my_func(d);
});
}
为什么这样做?从我的理解来看,outside_function
无法访问my_func
。为什么我不能先让my_func
公开?这是编译器做的事情还是我不知道的一些C ++规则?
此外,这种方法有没有可能会破坏我的代码?
答案 0 :(得分:6)
private
访问说明符仅限制对象 name 在类外部可见(无法查找)。对象本身就像任何其他成员一样。
[class.access]/1
班级的成员可以是
(1.1)私人;也就是说,它的名称只能由声明它的类的成员和朋友使用。
(1.2)受保护;也就是说,它的名称只能由声明它的类的成员和朋友,从该类派生的类以及他们的朋友使用(参见[class.protected])。
(1.3)公开;也就是说,它的名称可以在没有访问限制的任何地方使用。
答案 1 :(得分:2)
outside_function
永远不会访问该成员(它只知道func
参数的类型,并且不太可能关心它是如何定义的) - 只有lambda函数可以。
由于您在MyClass
内定义了lambda函数,因此您可以访问其中的所有私有名称。
outside_function
调用提供的功能,但如果您不允许调用使用任何私有成员的功能,则您无法做太多。