2017-02-25 21 views
7

Mam dwie funkcje, jedna z nich przyjmuje funkcję jako argument, który działa dobrze, ale chcę wywołać tę przekazaną funkcję w mojej drugiej.C++ przy użyciu funkcji przekazanej

class XY { 
public: 

    void first(void f()); 
    void second();   
}; 

void XY::first(void f()){ 

} 

void XY::second(){ 
f(); //passed function from first() 
} 
+0

Czy nazywasz sekund od pierwszego czy też zadzwonić sekund niezależnie w późniejszym punkt? – NineBerry

+1

Może chcesz rzucić okiem na to. http://stackoverflow.com/questions/12662891/passing-a-member-function-as-an-argument-in-c-c – Transzendental

+0

Najpierw zostanie wywołany jeden raz, a drugi zostanie wywołany niezależnie później – Maximilian

Odpowiedz

12

Możecie użyć std :: funkcję do zapamiętywania wymagalne i nazywają to później.

class X { 
    public: 
     void set(std::function<void()> f) { 
      callable = f; 
     } 

     void call() const { 
      callable(); 
     } 

    private: 
     std::function<void()> callable; 
}; 

void f() { 
    std::cout << "Meow" << std::endl; 
} 

Następnie utwórz X instancji i ustaw wymagalne:

X x; 
x.set(f); 

Później zadzwonić przechowywane wymagalne:

x.call(); 
+3

przegłosowana, wspaniała odpowiedź C++ 11, wspomnę tylko, że szablon jest częścią header – user

+0

@user Pominąłem niezbędne nagłówki, jak to zwykle robi się w książkach i prezentacjach, aby zaoszczędzić miejsce ... –

+0

Przepełnienie stosu nie jest ograniczone przestrzenią w taki sam sposób, jak książki i prezentacje, a także dyrektywy preprocesora, takie jak '# include' jest zalecane. –

Powiązane problemy