使用函数指针映射时的c ++调用函数
c++ calling function when using map of function pointer
我建立这个账户主要是因为我在别处找不到答案。我检查了 Whosebug 和不同页面上的各种教程或问题/答案。
我正在编写一个基于终端的文本冒险,需要一个函数映射。这就是我得到的(我遗漏了所有对问题不感兴趣的东西)
#include <map>
using namespace std;
class CPlayer
{
private:
//Players functions:
typedef void(CPlayer::*m_PlayerFunction)(void); //Function-pointer points to various player
//functions
map<char*, m_PlayerFunction> *m_FunctionMap; //Map containing all player functions
public:
//Constructor
CPlayer(char* chName, CRoom* curRoom, CInventory* Inventory);
//Functions:
bool useFunction(char* chPlayerCommand);
void showDoors(); //Function displaing all doors in the room
void showPeople(); //Function displaying all people in the room
};
#endif
#include "CPlayer.h"
#include <iostream>
CPlayer::CPlayer(char chName[128], CRoom* curRoom, CInventory *Inventory)
{
//Players functions
m_FunctionMap = new map<char*, CPlayer::m_PlayerFunction>;
m_FunctionMap->insert(std::make_pair((char*)"show doors", &CPlayer::showDoors));
m_FunctionMap->insert(std::make_pair((char*)"show people", &CPlayer::showPeople));
}
//Functions
//useFunction, calls fitting function, return "false", when no function ist found
bool CPlayer::useFunction(char* chPlayerCommand)
{
CFunctions F;
map<char*, m_PlayerFunction>::iterator it = m_FunctionMap->begin();
for(it; it!=m_FunctionMap->end(); it++)
{
if(F.compare(chPlayerCommand, it->first) == true)
{
cout << "Hallo" << endl;
(it->*second)();
}
}
return false;
}
现在,问题如下:
如果我这样调用函数:
(it->*second)();
这似乎是应该如何完成的,我收到以下错误:
error: ‘second’ was not declared in this scope
如果我这样调用函数:
(*it->second)();
这是我从这个线程得到的:Using a STL map of function pointers,我收到以下错误:
error: invalid use of unary ‘ * ’ on pointer to member
如果有人能帮助我,我会很高兴。提前感谢所有即将到来的答案。
PS:知道 "map" 或 "unordered_map" 是解决此问题的更好方法也很有趣。
正如我所说,在此先感谢:
国标
困难可能在于它同时是一个映射,并且它涉及指向成员的指针,这使得调用的语法更加复杂,并且必须在正确的位置使用许多括号。我认为应该是这样的:
(this->*(it->second))()
或者,正如 Rakete1111 指出的那样,以下方法也适用:
(this->*it->second)()
(请注意,后者不那么冗长,但对于那些头脑中没有运算符优先级的人来说也不太容易阅读)。
我建立这个账户主要是因为我在别处找不到答案。我检查了 Whosebug 和不同页面上的各种教程或问题/答案。
我正在编写一个基于终端的文本冒险,需要一个函数映射。这就是我得到的(我遗漏了所有对问题不感兴趣的东西)
#include <map>
using namespace std;
class CPlayer
{
private:
//Players functions:
typedef void(CPlayer::*m_PlayerFunction)(void); //Function-pointer points to various player
//functions
map<char*, m_PlayerFunction> *m_FunctionMap; //Map containing all player functions
public:
//Constructor
CPlayer(char* chName, CRoom* curRoom, CInventory* Inventory);
//Functions:
bool useFunction(char* chPlayerCommand);
void showDoors(); //Function displaing all doors in the room
void showPeople(); //Function displaying all people in the room
};
#endif
#include "CPlayer.h"
#include <iostream>
CPlayer::CPlayer(char chName[128], CRoom* curRoom, CInventory *Inventory)
{
//Players functions
m_FunctionMap = new map<char*, CPlayer::m_PlayerFunction>;
m_FunctionMap->insert(std::make_pair((char*)"show doors", &CPlayer::showDoors));
m_FunctionMap->insert(std::make_pair((char*)"show people", &CPlayer::showPeople));
}
//Functions
//useFunction, calls fitting function, return "false", when no function ist found
bool CPlayer::useFunction(char* chPlayerCommand)
{
CFunctions F;
map<char*, m_PlayerFunction>::iterator it = m_FunctionMap->begin();
for(it; it!=m_FunctionMap->end(); it++)
{
if(F.compare(chPlayerCommand, it->first) == true)
{
cout << "Hallo" << endl;
(it->*second)();
}
}
return false;
}
现在,问题如下:
如果我这样调用函数:
(it->*second)();
这似乎是应该如何完成的,我收到以下错误:
error: ‘second’ was not declared in this scope
如果我这样调用函数:
(*it->second)();
这是我从这个线程得到的:Using a STL map of function pointers,我收到以下错误:
error: invalid use of unary ‘ * ’ on pointer to member
如果有人能帮助我,我会很高兴。提前感谢所有即将到来的答案。
PS:知道 "map" 或 "unordered_map" 是解决此问题的更好方法也很有趣。
正如我所说,在此先感谢: 国标
困难可能在于它同时是一个映射,并且它涉及指向成员的指针,这使得调用的语法更加复杂,并且必须在正确的位置使用许多括号。我认为应该是这样的:
(this->*(it->second))()
或者,正如 Rakete1111 指出的那样,以下方法也适用:
(this->*it->second)()
(请注意,后者不那么冗长,但对于那些头脑中没有运算符优先级的人来说也不太容易阅读)。