wskaźnik na niestatyczną metodę

szukaj na forum nowy temat odpowiedz

Strona [ 1 2 >> ] z 2

uirapuru ten post 08-02-2010 13:29
avatar

Użytkownik
Status: Offline
Dołączył: 08-12-2009
Skąd: Gdynia/Olsztyn
Hej!

Z czysto ambicjonalnych pobudek chciałbym sobie poradzić z następującym problemem. Mam klasę abstrakcyjną ALG, po której dziedziczą P i IS. Klasa ALG potrzebuję, by zawierała wskaźnik na którąś ze swoich niestatycznych metod. Generalnie działa to tak, że użytkownik wybiera formę wprowadzania danych do tablicy (ręcznie, z pliku, losowo) a następnie switchem znajdującym się w main() chciałbym wykonywać coś w stylu
obiekt->akcja = obiekt->getFromUser();


na różne metody.

następnie uruchomiena chciałbym żeby została ta metoda z run() w klasie IS() lub P():

public run() {
   akcja();
   posortuj();
   printWyniki();
}


Mam nadzieję, że do tej pory jasne. Wiem, że mozna prosciej (np. chcialem umiescic switcha w klasie i przekazywac tam wynik wyboru uzytkownika, ale to wydaje mi sie prostackie), ale jak juz mowilem, chcialbym się i tego nauczyc. Do tej pory kod jaki stworzyłem i nie bardzo mi działa:

typedef void (ALG::* wskMetoda)();

class ALG {
public:
        wskMetoda Akcja;

        void generateRandomData(){}
        void getFile() {}
        void getFromUser() {}
        void printResults() { }
};

class P : public ALG {
public:
        void run() {
            Akcja();
            wyniki[a]=partition(0,rozmiar-2);
            printResults();
        }
    int partition(int lewa, int prawa){}
};

class IS : public ALG {
public:
    int sort() { }
    void run() {
        akcja();
        wyniki[a]=sort();
        printResults();
    }
};

int _tmain(int argc, _TCHAR* argv[]){

    scanf("%d",wybor);
                switch(wybor) {
                        case 1:
                                obiekt->akcja = obiekt->getFromUser();
                                break;
                        case 2:
                                obiekt->akcja = obiekt->generateRandomData();
                                break;
                        case 3:
                                obiekt->akcja = obiekt->setData(tab);
                                break;
                        case 4:
                                obiekt->akcja = obiekt->getFile();
                                break;
                }

        obiekt->run();
}


Oczywiście ten kod nie ruszy, mocno go okroiłem, chodzi mi raczej o zaprezentowanie mniej więcej struktury programu. Bardzo byłbym wdzięczny osobom, które są w stanie mi pomóc z nauczenie się jak konstruować i posługiwać się pointer to nonstatic member ;) Niestety wszystkie przykłady które sa na google albo są bez użycia klas, albo nie ma do nich dostępu z zewnątrz. No chyba, że jestem ślepy i nic nie widzę (w cpp próbuję sił od paru miesięcy dopiero). Z góry dzięki!!!!!!!
Grupo de Capoeira Camangula - Klub Sportowy Capoeira w Olsztynie
Sztuka, Walka, Taniec, Muzyka - www.capoeiraolsztyn.pl || klub@capoeiraolsztyn.pl
gg: 2096367 gsm: 604 411 089
Przejdź na górę strony
cytuj
-=mAkAbrAs=- ten post 08-02-2010 13:51
avatar

Użytkownik
Status: Offline
Dołączył: 15-12-2004
Skąd: KOSZALIN
Jeśli to Builder to spróbuj:
typedef void (__closure ALG::* wskMetoda)();

http://www.floatx.w8w.pl

Ostatnio zmodyfikowany: 08-02-2010 13:51 przez -=mAkAbrAs=-
Przejdź na górę strony
cytuj
uirapuru ten post 08-02-2010 14:03
avatar

Użytkownik
Status: Offline
Dołączył: 08-12-2009
Skąd: Gdynia/Olsztyn
Niestety, VS2k8
Grupo de Capoeira Camangula - Klub Sportowy Capoeira w Olsztynie
Sztuka, Walka, Taniec, Muzyka - www.capoeiraolsztyn.pl || klub@capoeiraolsztyn.pl
gg: 2096367 gsm: 604 411 089
Przejdź na górę strony
cytuj
MarekR22 ten post 08-02-2010 14:08
avatar

Użytkownik
Status: Offline
Dołączył: 26-01-2008

źle wywołujesz tą akcję, powinno być tak:
this->(*Akcja)();


Po drugie, do takiego wskaźnika nie wolno przypisać metody z klasy pochodnej (bo nie da się "skonwertować automatycznie wskaźnika this"). Musisz wymusić konwersję jeśli chcesz by to było możliwe.

Ostatnio zmodyfikowany: 08-02-2010 14:12 przez MarekR22
Przejdź na górę strony
cytuj
uirapuru ten post 08-02-2010 14:42
avatar

Użytkownik
Status: Offline
Dołączył: 08-12-2009
Skąd: Gdynia/Olsztyn
MarekR22 napisał:
źle wywołujesz tą akcję, powinno być tak:
this->(*Akcja)();


Po drugie, do takiego wskaźnika nie wolno przypisać metody z klasy pochodnej (bo nie da się "skonwertować automatycznie wskaźnika this"). Musisz wymusić konwersję jeśli chcesz by to było możliwe.

Dla this->(*Akcja)(); dostaję błąd syntax: "("

i jeszcze całą mase innych błędow (wklejam po poście).

A jesli dam ten wskaznic w obu pochodnych zamiast w bazowej ?

Error        3        error C2059: syntax error : '('        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        155        Insertion Sort
Error        4        error C2039: 'a' : is not a member of 'P'        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        156        Insertion Sort
Error        5        error C2597: illegal reference to non-static member 'ALG::wyniki'        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        156        Insertion Sort
Error        6        error C3867: 'ALG::wyniki': function call missing argument list; use '&ALG::wyniki' to create a pointer to member        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        156        Insertion Sort
Error        7        error C2597: illegal reference to non-static member 'ALG::rozmiar'        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        156        Insertion Sort
Error        8        error C3867: 'ALG::rozmiar': function call missing argument list; use '&ALG::rozmiar' to create a pointer to member        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        156        Insertion Sort
Error        9        error C2352: 'P::partition' : illegal call of non-static member function        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        156        Insertion Sort
Error        10        error C2352: 'ALG::printResults' : illegal call of non-static member function        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        158        Insertion Sort
Error        11        error C2597: illegal reference to non-static member 'ALG::data'        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        162        Insertion Sort
Error        12        error C3867: 'ALG::data': function call missing argument list; use '&ALG::data' to create a pointer to member        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        162        Insertion Sort
....
Error        56        error C2146: syntax error : missing ';' before identifier 'Akcja'        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        190        Insertion Sort
Error        57        error C4430: missing type specifier - int assumed. Note: C++ does not support default-int        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        190        Insertion Sort
Error        58        error C4430: missing type specifier - int assumed. Note: C++ does not support default-int        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        190        Insertion Sort
Error        59        error C2039: 'podstawienia' : is not a member of 'P'        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        196        Insertion Sort
Error        60        error C2039: 'a' : is not a member of 'P'        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        197        Insertion Sort
Error        61        error C2039: 'a' : is not a member of 'P'        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        197        Insertion Sort
Error        62        error C2597: illegal reference to non-static member 'ALG::rozmiar'        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        197        Insertion Sort
Error        63        error C3867: 'ALG::rozmiar': function call missing argument list; use '&ALG::rozmiar' to create a pointer to member        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        197        Insertion Sort
Error        64        error C2568: '<' : unable to resolve function overload        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        197        Insertion Sort

Grupo de Capoeira Camangula - Klub Sportowy Capoeira w Olsztynie
Sztuka, Walka, Taniec, Muzyka - www.capoeiraolsztyn.pl || klub@capoeiraolsztyn.pl
gg: 2096367 gsm: 604 411 089

Ostatnio zmodyfikowany: 09-02-2010 17:48 przez quetzalcoatl
Przejdź na górę strony
cytuj
MarekR22 ten post 08-02-2010 14:50
avatar

Użytkownik
Status: Offline
Dołączył: 26-01-2008

spróbuj tak:
(this->*Akcja)();

W tym miejscu zawsze mylę, gdzie mają być nawiasy.
Zresztą patrząc na typedef już widać jak powinno być z tymi nawiasami.

Ostatnio zmodyfikowany: 08-02-2010 14:51 przez MarekR22
Przejdź na górę strony
cytuj
uirapuru ten post 08-02-2010 15:00
avatar

Użytkownik
Status: Offline
Dołączył: 08-12-2009
Skąd: Gdynia/Olsztyn
Marku, faktycznie pomogło, tylko teraz mi pokazuje, że dla

obiekt->Akcja=obiekt->getFromUser();


Error        5        error C2440: '=' : cannot convert from 'void' to 'ALG::wskMetoda'        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        250        Insertion Sort


Tak do mnie dotarło, że chyba zapomniałem o referencji

obiekt->Akcja=&obiekt->getFromUser();


ale po takiej operacji wywala mi

Error        5        error C2102: '&' requires l-value        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        242        Insertion Sort

Grupo de Capoeira Camangula - Klub Sportowy Capoeira w Olsztynie
Sztuka, Walka, Taniec, Muzyka - www.capoeiraolsztyn.pl || klub@capoeiraolsztyn.pl
gg: 2096367 gsm: 604 411 089

Ostatnio zmodyfikowany: 08-02-2010 15:16 przez uirapuru
Przejdź na górę strony
cytuj
MarekR22 ten post 08-02-2010 15:19
avatar

Użytkownik
Status: Offline
Dołączył: 26-01-2008

obiekt->Akcja=&Alg::getFromUser;
Przejdź na górę strony
cytuj
uirapuru ten post 08-02-2010 15:32
avatar

Użytkownik
Status: Offline
Dołączył: 08-12-2009
Skąd: Gdynia/Olsztyn
wszystko byłoby ok, gdyby nie to że pytam specjalnie w temacie o NIE-statyczne metody ;) no albo ja jestem głupi i nie kumam tego, w każdym razie po zmianie jak napisałeś mam błąd

Error        5        error C2352: 'ALG::getFromUser' : illegal call of non-static member function        d:\Moje dokumenty\Visual Studio 2008\Projects\Insertion Sort\Insertion Sort\Insertion Sort.cpp        242        Insertion Sort


jeżeli dodam parametr static do metod to pewnie ruszy, pytanie tylko czy i jak sie zachowaja jezeli kazda z nich operuje na jakichś tam atrybutach klas... pewnie nie zadziała?
Grupo de Capoeira Camangula - Klub Sportowy Capoeira w Olsztynie
Sztuka, Walka, Taniec, Muzyka - www.capoeiraolsztyn.pl || klub@capoeiraolsztyn.pl
gg: 2096367 gsm: 604 411 089
Przejdź na górę strony
cytuj
Fanael ten post 08-02-2010 16:18


Użytkownik
Status: Offline
Dołączył: 03-07-2009

uirapuru napisał:
wszystko byłoby ok, gdyby nie to że pytam specjalnie w temacie o NIE-statyczne metody ;)
Ale właśnie w taki sposób się wyciąga wskaźnik na niestatyczną metodę klasy.
Anata no mirai ga shiawase de arimasu youni.
Przejdź na górę strony
cytuj
szukaj na forum nowy temat odpowiedz

Strona [ 1 2 >> ] z 2

1 użytkownik(ów) przegląda ten temat (1 gości)
(żadnych zarejestrowanych użytkowników)

Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 0.1304 sek. (zapytań SQL: 9)