之前问过这个,但没有得到答案。清理示例代码并删除任何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;
}
答案 0 :(得分:2)
初始化object1
和object2
时,m_functions
包含包含对this
的引用的lambda。一切都还好,直到现在。但是当你将对象推入std::vector
时,m_functions
也会被复制,同时还会引用原始对象!
当您在每个向量元素上调用callFunc
时,向量元素的m_memberValue
会更新,但随后会更新原始对象的task1
(和task2
), object1
和object2
被调用。由于您从未在callFunc
或object1
上致电object2
,m_memberValue
为0
。