wywołanie funkcji składowej klasy zapisanej w tablicy wewnątrz klasy
Ostatnio zmodyfikowano 2016-12-17 13:16
robaczek122 Temat założony przez niniejszego użytkownika |
wywołanie funkcji składowej klasy zapisanej w tablicy wewnątrz klasy » 2016-12-16 15:10:37 #include <iostream> using namespace std;
class A { public: void f1() { cout << "f1" << endl; } void f2() { cout << "f2" << endl; } void f3() { cout << "f3" << endl; } void f4() { cout << "f4" << endl; } void( A::* tab[ 4 ] )() = { & A::f1, & A::f2, & A::f3, & A::f4 }; void runFunction( int i ) { ( this->* tab[ i ] )(); } };
int main() { A a; for( int i = 0; i < 4; ++i ) a.runFunction( i ); ( a.f1 )(); ( a.tab[ 0 ] )(); return 0; }
Lepiej pokazuje przykład niż jestem w stanie to opisać. Chciałbym wywołać funkcję na obiekcie a klasy A, do której wskaźnik zapisany jest w tablicy wskaźników. Chodzi mi o bezpośrednie wywołania tak jak w linii, która się nie kompiluje. Błąd komilacji: main.cpp:33: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘a.A::tab[0] (...)’, e.g. ‘(... ->* a.A::tab[0]) (...)’ (a.A::tab[0])(); //blad kompilacji ^ |
|
robaczek122 Temat założony przez niniejszego użytkownika |
» 2016-12-16 15:35:33 ( a.*( a.tab[ 0 ] ) )(); ( a.* a.tab[ 0 ] )();
Hmm udało się jakoś samodzielnie to rozwiązać. Zostawiam jednak temat dla zainteresowanych, bo składnia wynikowa jest dosyć interesująca. |
|
mateczek |
» 2016-12-17 07:46:17
a.*( a.tab[ 0 ] ) )(); //zadziałało |
faktycznie na trzeźwo ciężko ogarnąć :P Ps, spójrz może na std::function?? mi to "uratowało życie" przy pisaniu biblioteki zrobiłem sobie kolejkę funkcji (nawet z parametrami) i tą kolejkę mogłem wykonywać w oddzielnym wątku(wątek główny tylko wrzucał funkcje do kolejki). #include <iostream> #include <functional> using namespace std;
class A { private: void f1() { cout << "f1" << endl; } void f2() { cout << "f2" << endl; } void f3( string parametr ) { cout << parametr << endl; } public: std::function < void() > tablica[ 3 ] = { std::bind( & f1, this ), std::bind( & f2, this ) }; void registerF3( string tekst ) { tablica[ 2 ] = std::bind( & f3, this, tekst ); } };
int main() { A a; a.registerF3( "a cos takiego" ); a.tablica[ 0 ](); a.tablica[ 1 ](); a.tablica[ 2 ](); return 0; } |
|
robaczek122 Temat założony przez niniejszego użytkownika |
» 2016-12-17 13:16:34 Piękne rozwiązanie, dzięki. |
|
« 1 » |