Objektum-metódusok címének lekérdezése

 ( vik1984 | 2005. február 8., kedd - 0:03 )

Objektum-metódusok címének lekérdezése

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

[quote:1f91a26eb4="algernon"][quote:1f91a26eb4="vik1984"][quote:1f91a26eb4="compi"]
Na akkor gondolkodjunk! - huuu ez de sz*r volt ;)

egy objektum egy adott fuggvenyenek meghivasahoz 2 informacio kell. Az egyik a fuggveny cime (a kodszegmensben rendszerint) a masik egy kivulrol gyakorlatilag nem lathato pointer, az objektum cime, a this. Ezt ugyan nem kell kulon atadnod a c++-ban, de bizony hogy a fuggveny tudja melyik objektumon dolgozzon epp, szuksege van ra. Rendelkezesre all ez a ket info ha csak egy ( a fuggveny cime) all rendelkezesre? Naugyehogyugye.
Ez alol kivetel persze a static member fuggveny, ahol nincs erteke a this-nek, ennek megfeleloen member valtozokra, fuggvenyekre nem is hivatkozhatsz. Itt eleg a fuggveny cime a meghivashoz, es jo szokas szerint void pointerben (vagy tipizaltban akar) atadod az objektum cimet rendes parameterben neki, amivel mar meg tud hivni nem static member fuggvenyeket a szerencsetlen. Ez a szokasos koreografia, ha moindjuk thread kent kell elindits egy objektum egy fuggvenyet.

Udv,

compi[/quote:1f91a26eb4]

Huh, thx, ez szép és jó, de...

Konkrétan az kéne, hogy egy pthread_create-nek átadjuk a külön threadként futtatandó függvényt és azt futtatnánk úgy, hogy az lássa az objektum mezőit is. Talán ha átadnám a példány címét, az segítene?[/quote:1f91a26eb4]

Nem lenne egyszerubb, ha a pthread_create() kapna egy sima C fuggvenyt, valamint annak argumentumakent (pthread_create utolso parametere), egy pointert egy objektumra? Es akkor a sima C fuggveny fogna es az objektum megfelelo metodusat meghivna? Magyarul csinalsz egy gonosz kis indirekciot, es akkor nem kell szenvedni egyeb workaroundokkal.[/quote:1f91a26eb4]

Valszeg ugy lesz, hogy egy C fuggvenyt kuld threadbe, majd az meghivja az objektum megfelelo metodusat. Csak gondoltam, hatha direktbe is menne-e. Azert koszonom a valaszokat, a problemat mar megoldtam.

[quote:99c7d869c2="compi"][quote:99c7d869c2="vik1984"][quote:99c7d869c2="compi"]
Na akkor gondolkodjunk! - huuu ez de sz*r volt ;)

egy objektum egy adott fuggvenyenek meghivasahoz 2 informacio kell. Az egyik a fuggveny cime (a kodszegmensben rendszerint) a masik egy kivulrol gyakorlatilag nem lathato pointer, az objektum cime, a this. Ezt ugyan nem kell kulon atadnod a c++-ban, de bizony hogy a fuggveny tudja melyik objektumon dolgozzon epp, szuksege van ra. Rendelkezesre all ez a ket info ha csak egy ( a fuggveny cime) all rendelkezesre? Naugyehogyugye.
Ez alol kivetel persze a static member fuggveny, ahol nincs erteke a this-nek, ennek megfeleloen member valtozokra, fuggvenyekre nem is hivatkozhatsz. Itt eleg a fuggveny cime a meghivashoz, es jo szokas szerint void pointerben (vagy tipizaltban akar) atadod az objektum cimet rendes parameterben neki, amivel mar meg tud hivni nem static member fuggvenyeket a szerencsetlen. Ez a szokasos koreografia, ha moindjuk thread kent kell elindits egy objektum egy fuggvenyet.

Udv,

compi[/quote:99c7d869c2]

Huh, thx, ez szép és jó, de...

Konkrétan az kéne, hogy egy pthread_create-nek átadjuk a külön threadként futtatandó függvényt és azt futtatnánk úgy, hogy az lássa az objektum mezőit is. Talán ha átadnám a példány címét, az segítene?[/quote:99c7d869c2]

class threadedobject
{
public:
static void thread_dispatch( void *arg );
void real_thread();
};

int main( int argc, char **argv )
{
threadedobject to;
thread_t thread_id;

int err = pthread_create( &thread_id, NULL, &threadedobject::thread_dispatch, &to);
}

void threadedobject::thread_dispatch( void *arg )
{
threadedobject *to=(threadedobject*)arg;
arg->real_thread();
}

Oszinten megvallva ezt csak ide vertem be, meg se probaltam leforditani, meg az is lehet hogy le se fordul, de az elv szerintem jol latszik belole.[/quote:99c7d869c2]

Hat persze hogy nem fordul le. itt van ami lefordul:

#include <pthread.h>
#include <unistd.h>

class threaded
{
public:
static void* thread_dispatch( void *arg );
void real_thread();
};

int main( int argc, char **argv )
{
threaded to;
pthread_t threadid;
pthread_create(&threadid, NULL, &threaded::thread_dispatch, &to);
sleep(10);
}

void* threaded::thread_dispatch( void * arg )
{
threaded *to = (threaded*)arg;
to->real_thread();
return NULL;
}

void threaded::real_thread()
{
}

Van egy kis problémám, mégpedig hogy nem tudom egy C++-os objektummetódus címét lekérdezni.
Teszem azt, legyen az adott objektum:
[code:1:107710d06f]class Valami {
public:
virtual void *fuggveny(void *) {
...
}
} peldany;[/code:1:107710d06f]

A gond az, hogy ha pl &(peldany.fuggveny) -t irok, azt a g++ nem szereti, ennek hangot is ad:
[code:1:107710d06f]test.cc:36: error: ISO C++ forbids taking the address of a bound member
function to form a pointer to member function. Say `&Valami::fuggveny'[/code:1:107710d06f]

A gond az, hogy nekem mindenképpen az adott példány címe kellene, nem pedig egy megadott objektum megadott metódusának a címe. Ez azért van, hogy pl. egy adott függvény indítsa el a példányhoz tartozó fuggveny nevű függvényt.

A válaszokat előre is köszönöm.

[quote:04766fb2e1="vik1984"]Van egy kis problémám, mégpedig hogy nem tudom egy C++-os objektummetódus címét lekérdezni.
Teszem azt, legyen az adott objektum:
[code:1:04766fb2e1]class Valami {
public:
virtual void *fuggveny(void *) {
...
}
} peldany;[/code:1:04766fb2e1]

A gond az, hogy ha pl &(peldany.fuggveny) -t irok, azt a g++ nem szereti, ennek hangot is ad:
[code:1:04766fb2e1]test.cc:36: error: ISO C++ forbids taking the address of a bound member
function to form a pointer to member function. Say `&Valami::fuggveny'[/code:1:04766fb2e1]

A gond az, hogy nekem mindenképpen az adott példány címe kellene, nem pedig egy megadott objektum megadott metódusának a címe. Ez azért van, hogy pl. egy adott függvény indítsa el a példányhoz tartozó fuggveny nevű függvényt.

A válaszokat előre is köszönöm.[/quote:04766fb2e1]

Na akkor gondolkodjunk! - huuu ez de sz*r volt ;)

egy objektum egy adott fuggvenyenek meghivasahoz 2 informacio kell. Az egyik a fuggveny cime (a kodszegmensben rendszerint) a masik egy kivulrol gyakorlatilag nem lathato pointer, az objektum cime, a this. Ezt ugyan nem kell kulon atadnod a c++-ban, de bizony hogy a fuggveny tudja melyik objektumon dolgozzon epp, szuksege van ra. Rendelkezesre all ez a ket info ha csak egy ( a fuggveny cime) all rendelkezesre? Naugyehogyugye.
Ez alol kivetel persze a static member fuggveny, ahol nincs erteke a this-nek, ennek megfeleloen member valtozokra, fuggvenyekre nem is hivatkozhatsz. Itt eleg a fuggveny cime a meghivashoz, es jo szokas szerint void pointerben (vagy tipizaltban akar) atadod az objektum cimet rendes parameterben neki, amivel mar meg tud hivni nem static member fuggvenyeket a szerencsetlen. Ez a szokasos koreografia, ha moindjuk thread kent kell elindits egy objektum egy fuggvenyet.

Udv,

compi

[quote:465826aac2="compi"]
Na akkor gondolkodjunk! - huuu ez de sz*r volt ;)

egy objektum egy adott fuggvenyenek meghivasahoz 2 informacio kell. Az egyik a fuggveny cime (a kodszegmensben rendszerint) a masik egy kivulrol gyakorlatilag nem lathato pointer, az objektum cime, a this. Ezt ugyan nem kell kulon atadnod a c++-ban, de bizony hogy a fuggveny tudja melyik objektumon dolgozzon epp, szuksege van ra. Rendelkezesre all ez a ket info ha csak egy ( a fuggveny cime) all rendelkezesre? Naugyehogyugye.
Ez alol kivetel persze a static member fuggveny, ahol nincs erteke a this-nek, ennek megfeleloen member valtozokra, fuggvenyekre nem is hivatkozhatsz. Itt eleg a fuggveny cime a meghivashoz, es jo szokas szerint void pointerben (vagy tipizaltban akar) atadod az objektum cimet rendes parameterben neki, amivel mar meg tud hivni nem static member fuggvenyeket a szerencsetlen. Ez a szokasos koreografia, ha moindjuk thread kent kell elindits egy objektum egy fuggvenyet.

Udv,

compi[/quote:465826aac2]

Huh, thx, ez szép és jó, de...

Konkrétan az kéne, hogy egy pthread_create-nek átadjuk a külön threadként futtatandó függvényt és azt futtatnánk úgy, hogy az lássa az objektum mezőit is. Talán ha átadnám a példány címét, az segítene?

[quote:82ca755add="vik1984"][quote:82ca755add="compi"]
Na akkor gondolkodjunk! - huuu ez de sz*r volt ;)

egy objektum egy adott fuggvenyenek meghivasahoz 2 informacio kell. Az egyik a fuggveny cime (a kodszegmensben rendszerint) a masik egy kivulrol gyakorlatilag nem lathato pointer, az objektum cime, a this. Ezt ugyan nem kell kulon atadnod a c++-ban, de bizony hogy a fuggveny tudja melyik objektumon dolgozzon epp, szuksege van ra. Rendelkezesre all ez a ket info ha csak egy ( a fuggveny cime) all rendelkezesre? Naugyehogyugye.
Ez alol kivetel persze a static member fuggveny, ahol nincs erteke a this-nek, ennek megfeleloen member valtozokra, fuggvenyekre nem is hivatkozhatsz. Itt eleg a fuggveny cime a meghivashoz, es jo szokas szerint void pointerben (vagy tipizaltban akar) atadod az objektum cimet rendes parameterben neki, amivel mar meg tud hivni nem static member fuggvenyeket a szerencsetlen. Ez a szokasos koreografia, ha moindjuk thread kent kell elindits egy objektum egy fuggvenyet.

Udv,

compi[/quote:82ca755add]

Huh, thx, ez szép és jó, de...

Konkrétan az kéne, hogy egy pthread_create-nek átadjuk a külön threadként futtatandó függvényt és azt futtatnánk úgy, hogy az lássa az objektum mezőit is. Talán ha átadnám a példány címét, az segítene?[/quote:82ca755add]

Nem lenne egyszerubb, ha a pthread_create() kapna egy sima C fuggvenyt, valamint annak argumentumakent (pthread_create utolso parametere), egy pointert egy objektumra? Es akkor a sima C fuggveny fogna es az objektum megfelelo metodusat meghivna? Magyarul csinalsz egy gonosz kis indirekciot, es akkor nem kell szenvedni egyeb workaroundokkal.

[quote:fe82688881="vik1984"][quote:fe82688881="compi"]
Na akkor gondolkodjunk! - huuu ez de sz*r volt ;)

egy objektum egy adott fuggvenyenek meghivasahoz 2 informacio kell. Az egyik a fuggveny cime (a kodszegmensben rendszerint) a masik egy kivulrol gyakorlatilag nem lathato pointer, az objektum cime, a this. Ezt ugyan nem kell kulon atadnod a c++-ban, de bizony hogy a fuggveny tudja melyik objektumon dolgozzon epp, szuksege van ra. Rendelkezesre all ez a ket info ha csak egy ( a fuggveny cime) all rendelkezesre? Naugyehogyugye.
Ez alol kivetel persze a static member fuggveny, ahol nincs erteke a this-nek, ennek megfeleloen member valtozokra, fuggvenyekre nem is hivatkozhatsz. Itt eleg a fuggveny cime a meghivashoz, es jo szokas szerint void pointerben (vagy tipizaltban akar) atadod az objektum cimet rendes parameterben neki, amivel mar meg tud hivni nem static member fuggvenyeket a szerencsetlen. Ez a szokasos koreografia, ha moindjuk thread kent kell elindits egy objektum egy fuggvenyet.

Udv,

compi[/quote:fe82688881]

Huh, thx, ez szép és jó, de...

Konkrétan az kéne, hogy egy pthread_create-nek átadjuk a külön threadként futtatandó függvényt és azt futtatnánk úgy, hogy az lássa az objektum mezőit is. Talán ha átadnám a példány címét, az segítene?[/quote:fe82688881]

class threadedobject
{
public:
static void thread_dispatch( void *arg );
void real_thread();
};

int main( int argc, char **argv )
{
threadedobject to;
thread_t thread_id;

int err = pthread_create( &thread_id, NULL, &threadedobject::thread_dispatch, &to);
}

void threadedobject::thread_dispatch( void *arg )
{
threadedobject *to=(threadedobject*)arg;
arg->real_thread();
}

Oszinten megvallva ezt csak ide vertem be, meg se probaltam leforditani, meg az is lehet hogy le se fordul, de az elv szerintem jol latszik belole.