2015-07-06 3 views
1

Я начал пытаться узнать std :: function после прочтения Скотта Майера Эффективного C++. Я сделал следующее пример программы, чтобы дать объект станд :: функцию к классуинициализация конструктора функций std

#include <iostream> 
#include <string> 
#include <functional> 

class FlyBehaviour 
{ 
    public : 
    void fly() 
    { 
    std::cout<<"Flying"; 
    /* Work Here */ 
    } 
}; 

typedef std::function<void(const FlyBehaviour&)> FlyFunc; 

class Duck 
{ 
    public : 
    Duck(FlyFunc flyFunc) : _flyFunc(flyFunc){} 

    private : 

    FlyFunc _flyFunc; 
}; 

int main() 
{ 
    Duck(&FlyBehaviour::fly); 
} 

Compiling приведенный выше код дает мне следующую ошибку

error: invalid use of qualified-name 'FlyBehaviour::fly' 

В исследовании, большинство интернет-пунктов к использованию std :: bind/boost :: bind как решение. Может кто-нибудь, пожалуйста, скажите мне, как его применять, особенно, где мне нужно объявить объект, к которому привязана функция?

+0

Какие решения выявили ваши исследования? Вы очень близки, но об этом спрашивали много раз ... _ «где мне нужно объявить объект» _ Где вам угодно? –

ответ

1

Вам необходимо либо bind a FlyBehaviour объект к функции std :: или подайте FlyBehavior при вызове функции. Вот пример прежней (обратите внимание, что я изменил ЬурейеЕ!):

#include <iostream> 
#include <string> 
#include <functional> 

class FlyBehaviour 
{ 
    public : 
    void fly() 
    { 
    std::cout<<"Flying"; 
    /* Work Here */ 
    } 
}; 

typedef std::function<void()> FlyFunc; 

class Duck 
{ 
    public : 
    Duck(FlyFunc flyFunc) : _flyFunc(flyFunc){} 
    void run() {_flyFunc();} 

    private : 

    FlyFunc _flyFunc; 
}; 

int main() 
{ 
    FlyBehaviour f; 
    Duck d(std::bind(&FlyBehaviour::fly, f)); 
    d.run(); 

Здесь подпись FlyBehaviour::fly «S является void(FlyBehaviour&), но я использовал std::bind привязать FlyBehaviour объект к первому аргументу, что делает его void().

+0

Большое спасибо за ответ. В моем раннем typedef была ли моя подпись тогда недействительной (FlyBehaviour &, FlyBehaviour &)? –

+0

Нет, ваш оригинальный typedef будет работать, но вам нужно будет передать объект FlyBehaviour для вызова функции. – rlbond

Смежные вопросы