Lambda函数调用有权访问类成员的成员函数

时间:2017-05-24 17:28:01

标签: c++ c++11 lambda

之前问过这个,但没有得到答案。清理示例代码并删除任何Qt。现在我想要实现的是一个用命令字符串调用并分支到适当函数的函数,而不是像

那样的函数
if ( str == "Task1" ) task1();  // QString if anyone wonders about the == :)
else if( str == "Task2" ) ) task2();
// and so on

我想将调用函数放在has中,并使用简单的散列查找来调用它们。它的工作原理是调用函数,但它似乎没有成员访问权限。以下代码打印出来

  

任务1:0

     

任务2:0

预期的行为是什么?

如果是,我怎样才能让它发挥作用?

#include "stdafx.h"

#include <map>
#include <string>
#include <functional>
#include <iostream>
#include <vector>

using namespace std;

struct MyClass
{
    MyClass() {
        m_functions.insert( pair<string, function<void()> >( string( "Task1" ), function<void()>( [this]() { task1(); } ) ) );
        m_functions.insert( pair<string, function<void()> >( string( "Task2" ), function<void()>( [this]() { task2(); } ) ) );
    }

    map<string, function<void()> >m_functions;
    int m_memberValue = 0;

    void callFunc( string key )
    {
        m_memberValue = 42;
        auto func = m_functions.find( key );
        if ( func != m_functions.end() )
        {
            func->second();
        }
    }

    void task1()
    {
        cout << "task1: " << m_memberValue << endl;
    }

    void task2()
    {
        cout << "task2: "  << m_memberValue << endl;
    }

};


int main()
{
    MyClass object1;
    MyClass object2;
    vector<MyClass>objects;
    objects.push_back( object1 );
    objects.push_back( object2 );

    objects[0].callFunc( string( "Task1" ) );
    objects[1].callFunc( string( "Task2" ) );
    string str;
    getline( cin, str );
    return 0;
}

1 个答案:

答案 0 :(得分:2)

初始化object1object2时,m_functions包含包含对this的引用的lambda。一切都还好,直到现在。但是当你将对象推入std::vector时,m_functions也会被复制,同时还会引用原始对象!

当您在每个向量元素上调用callFunc时,向量元素的m_memberValue会更新,但随后会更新原始对象的task1(和task2), object1object2被调用。由于您从未在callFuncobject1上致电object2m_memberValue0