Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;使用函数指针映射时调用函数_C++_Dictionary_Member Function Pointers - Fatal编程技术网

C++ c++;使用函数指针映射时调用函数

C++ c++;使用函数指针映射时调用函数,c++,dictionary,member-function-pointers,C++,Dictionary,Member Function Pointers,我建立这个帐户主要是因为我在别处找不到答案。我查看了stackoverflow和不同页面上的各种教程或问题/答案 我正在编写一个基于终端的textadventure,需要一个函数图。这就是我得到的(我遗漏了所有对问题不感兴趣的东西) #包括 使用名称空间std; 类CPlayer { 私人: //玩家功能: typedef void(CPlayer::*m_PlayerFunction)(void);//函数指针指向不同的播放器 //功能 map*m_FunctionMap;//包含所有播放器函

我建立这个帐户主要是因为我在别处找不到答案。我查看了stackoverflow和不同页面上的各种教程或问题/答案

我正在编写一个基于终端的textadventure,需要一个函数图。这就是我得到的(我遗漏了所有对问题不感兴趣的东西)

#包括
使用名称空间std;
类CPlayer
{
私人:
//玩家功能:
typedef void(CPlayer::*m_PlayerFunction)(void);//函数指针指向不同的播放器
//功能
map*m_FunctionMap;//包含所有播放器函数的映射
公众:
//建造师
CPlayer(字符*名称、克罗马*货币、库存*存货);
//职能:
布尔使用函数(char*chPlayerCommand);
void showDoors();//函数显示房间中的所有门
void showPeople();//函数显示房间中的所有人
};
#恩迪夫
#包括“CPlayer.h”
#包括
cLayer::cLayer(字符名称[128],CRoom*curRoom,CInventory*库存)
{
//玩家功能
m_FunctionMap=新地图;
m_FunctionMap->insert(std::make_对((char*)“show doors”、&CPlayer::showDoors));
m_FunctionMap->insert(std::make_pair((char*)“show people”、&CPlayer::showPeople));
}
//功能
//useFunction,调用fitting函数,在未找到函数时返回“false”
boolclayer::useFunction(char*chPlayerCommand)
{
c函数F;
迭代器it=m_FunctionMap->begin();
for(it;it!=m_FunctionMap->end();it++)
{
如果(F.compare(chPlayerCommand,it->first)=true)
{
cout*second)(;
这似乎是应该怎么做的,我得到以下错误:
错误:未在此范围内声明“second”

如果我这样调用函数:
(*it->second)(;
这是我从这个线程得到的:,我得到以下错误:
错误:在指向成员的指针上无效使用一元“*”

如果有人能帮助我,我将非常高兴。感谢所有即将到来的答案

PS:知道“映射”还是“无序映射”是解决这个问题的更好方法也很有趣

正如我所说,谢谢你:
GB

困难可能在于它同时是一个映射,并且它涉及到指向成员的指针,这使得调用语法更加复杂,必须在正确的位置插入大量括号。我认为应该是这样的:

(this->*(it->second))()
或者,正如Rakete1111所指出的,以下方法也适用:

(this->*it->second)()

(请注意,后者不太详细,但对于那些没有运算符优先级的人来说也不太容易阅读)。

可能重复提出的重复问题或搜索“调用成员函数指针”帮助您解决这个问题?在映射中使用
const char*
作为键是有问题的。没有理由让它变得更糟,使用指针作为映射键将其转换为
char*
不太可能很好地工作。而在映射上迭代寻找键并不是使用映射的方式。我认为这不是abo的完全重复ve问题。有两个运算符
->*
*
,这两个问题涵盖了它们中的每一个。是的,但您不需要嵌套的:
(此->*它->秒)()
也可以。这是一个很好的观点。
->
被证明具有比
->*
更高的优先级。我添加了它,但我个人还是更喜欢额外的括号以便于可读性。实际上,我会将它拆分为:
const auto fp=it->second;(这个->*fp)();
,指向成员函数的指针非常复杂,值得详细说明。
(this->*(it->second))()
(this->*it->second)()