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

C++ passing a member function as an argument to another member function

本文关键字:函数 成员 另一个 参数传递      更新时间:2023-10-16

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

#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);
}; 

和给我问题的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)
{}

Visual Studio标记这三个前面的括号,此(>*(&amp; player ::攻击(((瓷砖(,并给出工具提示"类型" void"的参数与键入" player :: FunctionPointer"。如果我尝试编译的编译器错误是'void Player :: ActionAdder(char,player :: functionPointer,std :: string(':无法将参数2从'void'转换为'void'到'player :: firctionpointer'。<<<<<</p>

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

谢谢

仔细阅读错误消息:

类型" 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");