wskaźnik na niestatyczną metodę
| uirapuru |
08-02-2010 13:29 |
|
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(): 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 |
|
|
| -=mAkAbrAs=- |
08-02-2010 13:51 |
|
Użytkownik Status: Offline Dołączył: 15-12-2004 Skąd: KOSZALIN |
Jeśli to Builder to spróbuj: http://www.floatx.w8w.pl Ostatnio zmodyfikowany: 08-02-2010 13:51 przez -=mAkAbrAs=- |
|
|
| uirapuru |
08-02-2010 14:03 |
|
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 |
|
|
| MarekR22 |
08-02-2010 14:08 |
|
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 |
|
|
| uirapuru |
08-02-2010 14:42 |
|
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 |
|
|
| MarekR22 |
08-02-2010 14:50 |
|
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 |
|
|
| uirapuru |
08-02-2010 15:00 |
|
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 |
|
|
| MarekR22 |
08-02-2010 15:19 |
|
Użytkownik Status: Offline Dołączył: 26-01-2008 |
obiekt->Akcja=&Alg::getFromUser;
|
|
|
| uirapuru |
08-02-2010 15:32 |
|
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łądError 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 |
|
|
| Fanael |
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. |
|
|
|
|
|
| 1 użytkownik(ów) przegląda ten temat (1 gości) |
|---|
| (żadnych zarejestrowanych użytkowników) |





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!!!!!!!




