繁体   English   中英

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

[英]Lambda function to call member function that has access to class members

之前问过这个但没有得到答案。 清理示例代码并删除所有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;
}

初始化object1object2m_functions包含lambda, m_functions lambda包含this的引用。 一切正常,直到现在。 但是,当您将对象推入std::vectorm_functions也会被复制,并带有对原始对象的引用!

当你调用callFunc每个向量元素上,所述m_memberValue向量元素被更新,但随后task1 (和task2 )从原始对象, object1object2 ,被调用。 因为你从来没有所谓callFuncobject1object2m_memberValue0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM