【问题标题】:Does passing lambdas violate encapsulation when they use a private member variable?使用私有成员变量时传递 lambda 是否违反封装?
【发布时间】:2016-01-11 02:21:03
【问题描述】:

我写了一个函数来传递给第三方的类。静态函数可以正常工作,直到该函数需要访问私有成员变量才能完成其工作。我可以使用 lambda 表达式来做到这一点(假设它自动或通过转换转换为 std::function)。

例子:

void classA::doingThings()
{
...
    classB::needsHelpToDoAThing(
    [&](std::type foo) -> size_t { return myFunction(foo); }
    );
...
}

size_t class::myFunction(type foo){
...
type someVar = m_somePrivateMember ...(some work)
...
}

但我真的不明白我在做什么。现在这个其他类正在使用来自不同类的私有成员变量。这不违反封装吗?这是 hack 还是我错过/误解了一个概念?

【问题讨论】:

  • 本质上,您将classA 指针(隐藏在lambda 中)传递给classB::needsHelpToDoAThing,然后它转身并通过该指针调用classA 的方法。当然,类的方法可以访问该类的任何成员。您也可以明确表示并将needsHelpToDoAThingclassA* 作为参数。
  • 不,“other”类没有使用“this”类的私有成员变量。另一个类正在调用作为“this”类成员的函数指针或函数对象,因此可以完全访问“this”类的私有成员和方法。
  • 没有封装被破坏。一切顺利。和你一样。
  • 感谢您为我分解它。用指针来解释它看起来更合理。

标签: c++ lambda encapsulation c++-concepts


【解决方案1】:

封装是指其他代码不会随意在你的内部乱窜。

在这里,您创建了一个辅助函数,可以在您的内脏中四处寻找。这个辅助函数是你的一部分,即使你把它传给了其他人。

这不会比访问私有数据的成员方法破坏封装。虽然它不是明确的类接口的一部分,但它仍然是实现的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 2023-03-18
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多