【问题标题】:How to access private member from lambda that is passed to constructor of friendly class?如何从传递给友好类的构造函数的 lambda 访问私有成员?
【发布时间】:2018-01-24 21:28:22
【问题描述】:

如何在此处从 lambda 访问静态成员?

class A
{
public:
    A(std::function<void()> f)
    {
        f();
    }
};

class B
{
private:
    friend class A;
    static bool c;
};

bool B::c = false;

A a([]() { B::c = true; });

这段代码给了我错误 C2248:

'B::c': 无法访问在类'B'中声明的私有成员

【问题讨论】:

  • 我认为这不会奏效。我认为 A 的(静态)成员函数可以改变它。
  • 您不能将 lambda 声明为好友。如果你想要这样的行为,你可以做一些技巧来暴露c,但这取决于你愿意改变多少/lambda是否是内部代码

标签: c++ c++11 lambda compiler-errors


【解决方案1】:

您不能在此处从 lambda 访问静态成员。

您将A 类标记为朋友,但您创建的lambda 与AB 没有直接关系——它有自己的类型,当然,它不是B 的朋友。这就是您尝试访问 B::c 时出错的原因。

您可以考虑将B::cA 构造函数传递给f 作为替代方案:

class A;

class B
{
private:
    friend class A;
    static bool c;
};

bool B::c = false;

class A
{
public:
    A(std::function<void(bool&)> f)
    {
        f(B::c);
    }
};

A a([](bool& value) { value = true; });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-16
    • 2022-07-22
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    相关资源
    最近更新 更多