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



我设置这个帐户主要是因为我在其他地方找不到答案。我检查了堆栈溢出和不同页面上的各种教程或问题/答案。

我正在编写一个基于终端的文本冒险,需要一个功能图。这就是我得到的(我省略了所有对问题不感兴趣的东西(

#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)();这是我从这个线程中得到的:使用函数指针的 STL 映射,我得到以下错误: error: invalid use of unary ‘ * ’ on pointer to member

如果有人能帮助我,我会很高兴。提前感谢所有即将到来的答案。

PS:知道"地图"或"unordered_map"是解决此问题的更好方法也会很有趣。

正如我所说,提前感谢:国标

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

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

或者,正如Rakete1111指出的那样,以下方法也可以:

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

(请注意,后者不那么冗长,但对于没有运算符优先级的人来说也不那么容易阅读(。

相关内容

  • 没有找到相关文章

最新更新