无法绑定 c++ 中抽象类中的函数

Cannot bind function from abstract class in c++

本文关键字:抽象类 函数 c++ 绑定      更新时间:2023-10-16

我尝试在抽象类中使用带有虚拟纯函数的std::bind,但是我使用设计模式调用策略,因为我想制作一个可以处理游戏之间动态切换的程序。

我听不懂语法。 这是代码:

这是我的接口类

class IGame
{
  public:
    virtual ~IGame(){};
    virtual void move_up(INFO &info)=0;
}

顺便说一下INFO是一个定义:

 #define INFO std::pair<struct GetMap*, struct WhereAmI*>

这是我在构造函数中的控件类,我调用std::bind调用;

 class CGame
  {
  private:
    IGame                                       *game;
    int                                         score;
    std::pair<struct GetMap*, struct WhereAmI*> info; // game information
    std::vector<std::function<void(std::pair<struct GetMap*, struct WhereAmI*>&)>> ptr_move_ft; //function pointer vector
  public:
    CGame();
    ~CGame();
    void return_get_map(INFO &info);
  }

这是CGame类的构造函数:

CGame::CGame()
 {
   game = new Snake();
   this->info = std::make_pair(init_map(MAP_PATH_SNAKE,0), game->init_player());
   ptr_move_ft.push_back(std::bind(&CGame::return_where_i_am, this,std::placeholders::_1)); //this work
   ptr_move_ft.push_back(std::bind(&game->move_up, game, std::placeholders::_1)); //this create a error
 }

所以第二个push_back会犯这个错误:

source/CGame.cpp: In constructor ‘arcade::CGame::CGame()’:
source/CGame.cpp:131:44: error: ISO C++ forbids taking the address of a bound member function to form a pointer to member function.  Say ‘&arcade::IGame::move_up’ [-fpermissive]
     ptr_move_ft.push_back(std::bind(&game->move_up, game, std::placeholders::_1));

我该怎么办?

很抱歉我的英语和 c++ 代码很差。

问题是此行中&game->move_up表达式:

ptr_move_ft.push_back(std::bind(&game->move_up, game, std::placeholders::_1));

此表达式尝试创建指向成员函数的指针,但这些指针未绑定到特定实例。 因此,从特定实例创建指向成员函数的指针是没有意义的,类似于尝试通过实例调用静态方法。

您应该使用 &IGame::move_up 而不是&game->move_up .

您也可以使用 &std::decay<decltype(*game)>::type::move_up . 优点是这个表达式会调整以匹配*game的类型,在任何指向的类型上查找名为move_up的实例方法。 缺点是语法有点迟钝。

(下面是一个演示,演示了这两种方法将如何生成相同的指向成员函数的指针。