c++ - 从用类方法编写的 lambda 函数访问类字段

标签 c++ lambda c++11

代码示例可能更具描述性:

class CDialog
{
    CButton* ButtonPtr;
    bool m_Visible;
    void SomeMethod ();
}

class CButton
{
public:
    std::tr1::function<void(void)> Function;
}

void CDialog::SomeMethod()
{
    ButtonPtr = new CButton;
    std::tr1::function<void(void)> TempF = [this]
    {
        this->m_Visible = false;
    };
    ButtonPtr->Function = TempF;
}

现在,当我尝试调用 TempF 时,它似乎修改了 m_Visible 变量的某些拷贝而不是实际值。我想问问它是否是默认行为,是否有某种方式可以那样使用它。我的修补程序使用了指针,效果很好,但我很好奇是否可以这样做。

编辑:我创建了一个最小示例,它确实有效。

EDIT2:修复了不调用函数的错误。

EDIT3:更改为更准确地匹配我的问题。假设单击按钮时调用 CButton 的函数,并且已确认。还是不行。

EDIT4:花了一些时间用调试器检查它。创建函数时使用的“this”指针的值与调用函数时使用的值不同。那么我做错了什么吗?

EDIT5:在我的代码中发现错误,修复并结合答案解决了我的问题。感谢大家的回复,多亏了你们,我今天学到了一些新东西!

最佳答案

根据 C++11 规范(注意:VC2010 实现了旧形式的 lambda,因为规范当时还没有完成),this 只能被 捕获值,而不是引用。因此,如果您执行 [&],您将捕获除 this 之外的所有内容。

要执行您想要的操作,您必须按值捕获 [=] 或显式捕获 this:[&, this]

关于c++ - 从用类方法编写的 lambda 函数访问类字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9351240/

相关文章:

C++ SFML 2.1 模板错误

c++ - boost::asio::ip::tcp::socket 已连接?

C# lambda 函数含义和 C++ 翻译

c++ - 具有相同签名和捕获的常见 lambda 类型

c# - Lambda 不同选择

c++ - boost std unique_ptr 的 STL 集合的序列化

c++11 - 如何通过指针从容器中删除 unique_ptr?

C++ 静态函数和线程安全

c++ - 如果 lhs 或 rhs 对象是 float ,则 operator+ 的结果是 float

c++ - 不同VkInstances之间的返回值vkEnumeratePhysicalDevices是否一致?