无法在 C++ 中从抽象 class 绑定函数
Cannot bind function from abstract class in c++
我尝试将 std::bind
与抽象的虚拟纯函数一起使用 class 但是
我使用设计模式调用策略,因为我想制作一个可以处理游戏之间动态切换的程序。
我不明白语法。这是代码:
这是我的界面class
class IGame
{
public:
virtual ~IGame(){};
virtual void move_up(INFO &info)=0;
}
顺便说一句 INFO
是一个定义 :
#define INFO std::pair<struct GetMap*, struct WhereAmI*>
这是我的控件 class 在它的构造函数中我调用 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
class的构造函数:
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));
此表达式试图创建指向成员函数的指针,但这些指针未绑定到特定实例。因此,从特定实例创建指向成员函数的指针是没有意义的,类似于尝试通过实例调用静态方法。
而不是 &game->move_up
你应该使用 &IGame::move_up
.
您也可以使用&std::decay<decltype(*game)>::type::move_up
。优点是此表达式将调整以匹配 *game
的类型,在任何指向的类型上寻找名为 move_up
的实例方法。缺点是语法有点生疏
(Here is a demo 这表明这两种方法将如何产生相同的指向成员函数的指针。)
我尝试将 std::bind
与抽象的虚拟纯函数一起使用 class 但是
我使用设计模式调用策略,因为我想制作一个可以处理游戏之间动态切换的程序。
我不明白语法。这是代码:
这是我的界面class
class IGame
{
public:
virtual ~IGame(){};
virtual void move_up(INFO &info)=0;
}
顺便说一句 INFO
是一个定义 :
#define INFO std::pair<struct GetMap*, struct WhereAmI*>
这是我的控件 class 在它的构造函数中我调用 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
class的构造函数:
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));
此表达式试图创建指向成员函数的指针,但这些指针未绑定到特定实例。因此,从特定实例创建指向成员函数的指针是没有意义的,类似于尝试通过实例调用静态方法。
而不是 &game->move_up
你应该使用 &IGame::move_up
.
您也可以使用&std::decay<decltype(*game)>::type::move_up
。优点是此表达式将调整以匹配 *game
的类型,在任何指向的类型上寻找名为 move_up
的实例方法。缺点是语法有点生疏
(Here is a demo 这表明这两种方法将如何产生相同的指向成员函数的指针。)