C++ C++;将成员函数作为参数传递给另一个成员函数

C++ C++;将成员函数作为参数传递给另一个成员函数,c++,member-function-pointers,C++,Member Function Pointers,我想将一个成员方法作为参数传递给另一个成员方法。我已经对此进行了广泛的研究,但仍然看不出是否正确。我的头文件如下 #include <string> #include <map> #include <functional> #include "Entity.h" #include "World.h" #include "Item.h" class Tile; class Player : public Entity { private: usin

我想将一个成员方法作为参数传递给另一个成员方法。我已经对此进行了广泛的研究,但仍然看不出是否正确。我的头文件如下

#include <string>
#include <map>
#include <functional>

#include "Entity.h"
#include "World.h"
#include "Item.h"

class Tile;

class Player : public Entity
{
private:
    using FunctionPointer = void (Player::*)(Tile*);
    bool victory;
    Point location;
    std::map<char, FunctionPointer> actions;

public:
    Player(std::string name, int gold, int maxHitPoints, int defensePoints, 
           Point startingLocation, int maxDamage = 0, int maxItems = -1,
           std::vector<Item*> inventory = std::vector<Item*>());

    std::string getClassName() const override;

    void printInventory(Tile*) override; 
    std::string toString() override;

    Point getLocation() const;
    Item* findMostPowerfulWeapon();
    void heal(Tile*);
    void moveNorth(Tile*);
    void moveSouth(Tile*);
    void moveEast(Tile*);
    void moveWest(Tile*);
    void attack(Tile* tile);
    void pickup(Tile* tile);
    void trade(Tile* tile);

    void getAvailableActions(Tile* tile);
    void chooseAction();

private:
    void move(int dx, int dy);
    void actionAdder(char hotkey, FunctionPointer, std::string name);
}; 
#包括
#包括
#包括
#包括“实体h”
#包括“World.h”
#包括“项目h”
类瓷砖;
类播放器:公共实体
{
私人:
使用FunctionPointer=void(玩家::*)(平铺*);
布尔胜利;
点定位;
映射动作;
公众:
玩家(std::字符串名称、整数黄金、整数最大生命值、整数防御值、,
点开始位置,int-maxDamage=0,int-maxItems=-1,
std::vector inventory=std::vector());
std::string getClassName()常量重写;
作废打印库存(平铺*)覆盖;
std::string toString()重写;
点getLocation()常量;
Item*FindMostPowerfulBearm();
空洞愈合(瓷砖*);
北移(瓷砖*);
南移(瓷砖*);
东行(瓷砖*);
西行(瓷砖*);
虚空攻击(瓷砖*瓷砖);
空隙拾取(瓷砖*瓷砖);
无效交易(瓷砖*瓷砖);
无效getAvailableActions(平铺*平铺);
void chooseAction();
私人:
无效移动(整数dx,整数dy);
void actionAdder(char热键、FunctionPointer、std::string name);
}; 
cpp文件的一部分给我带来了如下问题:

void Player::getAvailableActions(Tile * tile)
{
    actions.clear();
    std::cout << "Choose an action:" << std::endl;
    if (getInventory().size() > 0)
        actionAdder('i', (this->*(&Player::printInventory))(tile), "Print inventory");
    if (tile->getClassName() == "Trader")
        actionAdder('t', (this->*(&Player::trade))(tile) , "Trade");
    if (tile->getClassName() == "Monster")
        actionAdder('a', (this->*(&Player::attack))(tile), "Attack");
}

void Player::actionAdder(char hotkey, FunctionPointer action, std::string name)
{}
void播放器::getAvailableActions(平铺*平铺)
{
动作。清除();
std::cout*(&Player::printInventory))(平铺),“Print inventory”);
如果(平铺->getClassName()=“交易员”)
actionAdder('t',(此->*(&Player::trade))(平铺),“trade”);
如果(平铺->getClassName()=“怪物”)
actionAdder('a',(this->*(&Player::attack))(tile),“attack”);
}
void Player::actionAdder(字符热键、函数指针操作、std::字符串名称)
{}
Visual studio在所有三个this(this->*(&Player::attack))(tile)前面标记括号,并给出工具提示“void”类型的参数与“Player::FunctionPointer”类型的参数不兼容。如果我尝试编译,我得到的编译器错误是“void Player::actionAdder(char,Player::FunctionPointer,std::string)”:无法将参数2从“void”转换为“Player::FunctionPointer”

如果有人知道我做错了什么,我将非常感谢任何建议。如果您需要查看更多代码或更多详细信息,请告诉我。密码不是超级机密


谢谢

仔细阅读错误消息:

类型为“
void
”的参数与类型为的参数不兼容

无法将参数2从“
void
”转换为“
Player::FunctionPointer

这是因为这里的论点2:

actionAdder('i', (this->*(&Player::printInventory))(tile), "Print inventory");
实际上正在调用
printInventory
,并试图将调用结果传递到
actionAdder()
。但这是一个
void
函数,您不能将类型为
void
的内容传递给其他内容-因此,错误恰恰是这样抱怨的

您不想调用
printInventory
,只想传递一个指向它的指针。那只是:

actionAdder('i', &Player::printInventory, "Print inventory");

请仔细阅读错误消息:

类型为“
void
”的参数与类型为的参数不兼容

无法将参数2从“
void
”转换为“
Player::FunctionPointer

这是因为这里的论点2:

actionAdder('i', (this->*(&Player::printInventory))(tile), "Print inventory");
实际上正在调用
printInventory
,并试图将调用结果传递到
actionAdder()
。但这是一个
void
函数,您不能将类型为
void
的内容传递给其他内容-因此,错误恰恰是这样抱怨的

您不想调用
printInventory
,只想传递一个指向它的指针。那只是:

actionAdder('i', &Player::printInventory, "Print inventory");

建议——如果问题出在成员函数指针上,请使用两个伪函数测试一个简单类,一个使用函数指针参数的成员函数和一个试图调用函数的简单3行或4行
main
程序。不需要所有这些代码来解释您在成员函数指针的概念方面遇到的问题。除了我将成员函数指针传递给同一类中的另一个函数,而不是从main传递。我能找到的所有例子都符合你的建议。然而,这不是我想要做的。如果你接受了答案,你会发现你可以用一个小得多的例子来重复你的问题吗?任何C++编码/编译器问题都可以用几行代码复制。我确实看到了,并且我很感激您的建议。有时使用stackoverflow很难知道要提供多少代码。我看到过这样的例子:问问题的人被告知他们没有提供足够的信息,或者曾经流行的“你为什么要这样做”。在将来,如果我有另一个问题,我将尝试用更少的代码复制这个问题。建议--如果问题是成员函数指针,请使用两个伪函数测试一个简单类,一种成员函数,使用函数指针参数和一个简单的3或4行
main
程序试图调用该函数。不需要所有这些代码来解释您在成员函数指针的概念方面遇到的问题。除了我将成员函数指针传递给同一类中的另一个函数,而不是从main传递。我能找到的所有例子都符合你的建议。然而,这不是我想要做的。如果你接受了答案,你会发现你可以用一个小得多的例子来重复你的问题吗?任何C++编码/编译器问题都可以用几行代码复制。我确实看到了,并且我很感激您的建议。有时使用stackoverflow很难知道要提供多少代码。我看到过一些例子,其中