【问题标题】:Cannot bind function from abstract class in c++无法从 C++ 中的抽象类绑定函数
【发布时间】:2017-03-27 18:12:29
【问题描述】:

我尝试在抽象类中将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++ 代码。

【问题讨论】:

  • 请不要使用#define typedef 会这样做
  • 你的问题不是很清楚,因为编译器已经说你不能这样做。您应该改写问题以询问您实际想要实现的目标。就目前而言,它无法修复

标签: c++ function c++11 abstract-class stdbind


【解决方案1】:

问题在于这一行中的表达式&amp;game-&gt;move_up

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

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

您应该使用&amp;IGame::move_up,而不是&amp;game-&gt;move_up

您也可以使用&amp;std::decay&lt;decltype(*game)&gt;::type::move_up。优点是这个表达式将调整以匹配*game 的类型,在任何指向的类型上寻找一个名为move_up 的实例方法。缺点是语法有点生硬。

Here is a demo 显示了这两种方法将如何产生相同的指向成员函数的指针。)

【讨论】:

  • 非常感谢!
猜你喜欢
  • 2014-06-27
  • 2019-01-18
  • 1970-01-01
  • 2010-12-12
  • 2011-04-05
  • 2011-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多