Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

wywołanie funkcji składowej klasy zapisanej w tablicy wewnątrz klasy

Ostatnio zmodyfikowano 2016-12-17 13:16
Autor Wiadomość
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
C/C++
#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 ] )(); //blad kompilacji, jak to wywołać
   
    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
                   ^
P-155046
robaczek122
Temat założony przez niniejszego użytkownika
» 2016-12-16 15:35:33
C/C++
( a.*( a.tab[ 0 ] ) )(); //zadziałało
( a.* a.tab[ 0 ] )(); //lub tak

Hmm udało się jakoś samodzielnie to rozwiązać.
Zostawiam jednak temat dla zainteresowanych, bo składnia wynikowa jest dosyć interesująca.
P-155049
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).
C/C++
#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; } //funkcja z parametrem
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" ); //dopisuje do tablicy funkcję f3(). I aby było ciekawiej przekazuje jej parametr typu string;
    a.tablica[ 0 ]();
    a.tablica[ 1 ]();
    a.tablica[ 2 ](); // tutaj zarejestrowana funkcja f3 z parametrem. miłe zachowanie
    return 0;
}
P-155073
robaczek122
Temat założony przez niniejszego użytkownika
» 2016-12-17 13:16:34
Piękne rozwiązanie, dzięki.
P-155083
« 1 »
  Strona 1 z 1