🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux.programowanie
3 messages
3 total messages Started by Jacek Danecki Wed, 29 Sep 1999 13:13
Jak przekonwertować metodę na funkcję?
#700
Author: Jacek Danecki
Date: Wed, 29 Sep 1999 13:13
28 lines
1400 bytes
Witam!

Mam sobie klasę:

class Klasa
{
public:
	void funkcja();
};

i funkcję:
	void pokaz(jaka_funkcja f);

gdzie:
	typedef void (* jaka_funkcja)();

robię teraz zmienną:
	Klasa a;
i chciałbym wywołać funkcję:
	pokaz(a.funkcja);

Jak teraz zamienić typ (Klasa::*) na jaka_funkcja?

-- 
Jacek Danecki
mail: biv@micronet.com.pl
www:  http://www.micronet.com.pl/~biv
Registered Linux user number 137044
Re: Jak przekonwertować metodę na funkcję?
#703
Author: Cezary H. Noweta
Date: Wed, 29 Sep 1999 14:09
44 lines
1892 bytes
Witam,

Jacek Danecki wrote:
> 
> Witam!
> 
> Mam sobie klasę:
> 
> class Klasa
> {
> public:
>         void funkcja();
> };
> 
> i funkcję:
>         void pokaz(jaka_funkcja f);
> 
> gdzie:
>         typedef void (* jaka_funkcja)();
> 
> robię teraz zmienną:
>         Klasa a;
> i chciałbym wywołać funkcję:
>         pokaz(a.funkcja);
> 
> Jak teraz zamienić typ (Klasa::*) na jaka_funkcja?

Przy takim wywolaniu funkcja() nie moze korzystac ze skladnikow
klasy Klasa (wszystkie metody  - oprocz static - maja niejawny parametr
this podczas, gdy 'zwykla' funkcja go nie ma), wiec:
1. W def. klasy:

static void funkcja();

2. Wywolac:

pokaz(Klasa::funckja());

  -- pozdrawiam

-- 
Cezary H. Noweta                 90-237 LODZ, ul. J.Matejki 34/38 POLAND
(chn@irys.usun.drugiitrzeciczlon.uni.lodz.pl)    +48 42 6356013, 6356012
University of Lodz - Main Library                            fax 6781678
Re: Jak przekonwertować metodę na funkcję?
#701
Author: Arkadiusz Nagorka
Date: Wed, 29 Sep 1999 17:01
61 lines
2365 bytes
Jacek Danecki wrote:

> Witam!
>
> Mam sobie klasę:
>
> class Klasa
> {
> public:
>         void funkcja();
> };
>
> i funkcję:
>         void pokaz(jaka_funkcja f);
>
> gdzie:
>         typedef void (* jaka_funkcja)();
>
> robię teraz zmienną:
>         Klasa a;
> i chciałbym wywołać funkcję:
>         pokaz(a.funkcja);

Aby uzyskać wskaźnik do metody, trzeba napisać &Klasa::funkcja (& jest
potrzebny, chociaż na starych kompilatorach może działać i bez). Widać
więć, że wskaźnik nie zawiera informacji o obiekcie, na którym metoda
(niestatyczna) ma być wykonana. Fukcja pokaz ma za mało argumentów.

> Jak teraz zamienić typ (Klasa::*) na jaka_funkcja?

Jest to niedopuszczalne, wskaźniki na metody są zaimplementowane
(chyba) jako indeksy, a nie jako wskaźniki do początku kodu,
rzutowanie spowodowałoby katastrofę. Poza tym dla wielu implementacji
pierwszym niejawnym argumentem metody niestatycznej jest this,
więc nie zgadzałyby się argumenty.

Jeśli Klasa::funkcja byłaby statyczną funkcją składową, to jedyną
zmianą byłoby zastosowanie prawidłowej składni pobrania wskaźnika
do metody

pokaz(&Klasa::funkcja);

W przypadku niestatycznej funkcji składowej konieczne jest przekazanie
jakoś adresu obiektu, na którym metoda ma byc wywołana, np.

typedef void (Klasa::*jakas_metoda)();

void pokaz(Klasa& obj, jakas_metoda metoda)
{
   (obj.*metoda)();
}

i wywołać

Klasa a;
pokaz(a, &Klasa::funkcja);

Pozdrawiam

Arek
.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads