C 将成员函数作为参数传递给另一个成员函数
C++ passing a member function as an argument to another member function
我想将成员方法作为参数传递给另一个成员方法。我已经对此进行了广泛的研究,但仍然看不到它是正确的。我的标题文件如下
#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");
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针