2017-03-27 3 views
0

J'essaie d'utiliser std::bind avec une fonction pure virtuelle dans une classe abstraite mais J'utilise une stratégie d'appel de modèle de conception, car je veux créer un programme capable de gérer le basculement dynamique entre Jeu.Impossible de lier la fonction de la classe abstraite en C++

Je n'obtiens pas la syntaxe. voici le code:

Voici ma classe d'interface

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

Par ailleurs INFO est DEFINE:

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

Voici ma classe de contrôle dans son constructeur que j'appelle std::bind appel;

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

Ceci est le constructeur de CGame classe:

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 
} 

Ainsi, la deuxième push_back fait cette erreur:

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

Comment puis-je faire? Désolé pour mon mauvais code anglais et C++.

+3

s'il vous plaît ne pas user '# define' lorsqu'un' typedef' fera – user463035818

+0

votre question isnt que ce soit clair, parce que le compilateur dit déjà que vous ne pouvez pas le faire. Vous devriez reformuler la question pour demander ce que vous voulez réellement accomplir. Comme c'est maintenant il ne peut pas être réparé – user463035818

Répondre

1

Le problème est l'expression &game->move_up dans cette ligne:

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

Cette expression tente de créer un pointeur à fonction membre, mais ces pointeurs ne sont pas liés à un cas particulier. La création d'une fonction pointeur vers membre à partir d'une instance particulière n'a donc aucun sens, similaire à la tentative d'invocation d'une méthode statique via une instance.

Au lieu de &game->move_up, vous devez utiliser &IGame::move_up.

Vous pouvez également utiliser &std::decay<decltype(*game)>::type::move_up. L'avantage est que cette expression s'ajustera pour correspondre au type de *game, à la recherche d'une méthode d'instance nommée move_up sur quel que soit le type pointé. L'inconvénient est que la syntaxe est un peu obtuse.

(Here is a demo qui montre comment les deux approches donneront un pointeur à fonction membre identique.)

+0

Merci beaucoup! – Add411