Przeanalizuj kod:
Wskaźnik na metodę_________________________________________________________________
Mam problem, bo nie rozumiem pojęcia referencji na metodę.Why doesn't reference-to-member exist in C++?Reference to member function?There is no “reference-to-member” type in C++. |
Is the type of “pointer-to-member-function” different from “pointer-to-function”? std::vector < void( * )( void ) > clickEvents;
na
std::vector < void( Object::* )( void ) > clickEvents;
.
void addEvent( void( & f )( void ) );
na
void addEvent( void( Object::* f )( void ) );
.
___________________________________________________________________
Metoda musi być wykonana na obiekcie danej klasy.
Jako że jest to wskaźnik na niestatyczną metodę to (jak kompilator mi powiedział):
must use '.*' or '->*' to call pointer-to-member function in 'r (...)', e.g. '(... ->* r) (...)' |
r();
zamienić na
* this.* r();
lub
this->* r();
.
(
Statyczne zmienne i metody w klasie)
Wyjątkiem jest metoda statyczna. Co by Ci pozwoliło na:
r();
.
Wskaźnik na statyczną metodę zachowuje się tak samo jak wskaźnik na normalną funkcję.
Z tym wyjątkiem, że znajduje się znajduje się w przestrzeni adresowej klasy.
Object::test();
, gdyby
test była metodą statyczną.
Więc tak uzyskiwałoby się wskaźnik:
& Object::test
,
jakby
Object był przestrzenią nazw.
(
How to define a function pointer pointing to a static member function?)
___________________________________________________________________
Nawiązując do mojego mojego starego tematu (
adres adresu funkcji)...
Niejawna konwersja funkcji na wskaźnik na funkcję
nie zachodzi w przypadku metod.
obj1.addEvent( Object::test1 );
na
obj1.addEvent( & Object::test1 );
.
___________________________________________________
Oto jak posiekałem twój kod,
który się u mnie kompiluje:
#include <vector>
#include <iostream>
class Object
{
private:
typedef void( Object::* Event )( void );
std::vector < Event > clickEvents;
public:
Object() { };
~Object() { };
void addEvent( Event event ) { clickEvents.push_back( event ); }
void click() { for( auto && clickEvent: clickEvents )( this->* clickEvent )(); };
void event() { std::cout << "clickEvent happened!" << std::endl; }
};
int main( int argc, char ** argv )
{
Object object;
object.addEvent( & Object::event );
object.click();
return 0;
}
Z góry przepraszam za czytelność.
EDIT1:
Zły możesz być tylko na DejaVu,
że nie dał funkcji podglądu. ;D
EDIT2:
Tak BTW dlaczego nie możesz stworzyć wektora referencji:
Why can't I make a vector of references?Ale jak widać niżej, ktoś ma dla Ciebie rozwiązanie. :)
EDIT3: Zbieram podziękowania do kolekcji. :D