Switch与映射使用报错:被调用对象类型不是函数或函数指针
问题原因
- 你声明的
std::map<int, void(MerkelMain::*)()>存储的是类非静态成员函数指针,这类指针的调用必须绑定具体的类实例对象,你直接用menu[x]()的调用方式缺少类实例参数,因此触发编译报错。
修复方案
方式1:保留现有结构,修改调用语法
因为当前代码是在MerkelMain类的成员函数内部,可以直接用this指针作为实例绑定对象,成员函数指针的调用语法为(实例指针->*函数指针)(参数列表),修改后switch分支内的调用代码如下:
case 1: (this->*menu[1])(); break; // 其余case按照相同规则修改即可
方式2:优化冗余的switch结构
既然已经用map做了序号到函数的映射,完全可以省略switch分支,进一步简化代码:
void MerkelMain::processUserOption() { std::map<int, void(MerkelMain::*)()> menu; menu[1] = &MerkelMain::printHelp; menu[2] = &MerkelMain::printMarketStats; menu[3] = &MerkelMain::enterOffer; menu[4] = &MerkelMain::enterBid; menu[5] = &MerkelMain::printWallet; menu[6] = &MerkelMain::goToNextTimeFrame; int option = getUserOption(); if (menu.count(option)) { (this->*menu[option])(); } else { std::cout << "Invalid input. Please enter a value between 1 and 6." << std::endl; } }
内容的提问来源于stack exchange,提问作者oknotok
相关产品推荐
相关产品推荐

