Frage zu eigenr Messagequeueclass
-
Ich hab eine Klasse programmiert, die Funktionspointer entgegennimmt, in einer std::list speichert und dann von der Klasse alle Funktionspointer dereferenziert und gelöscht werden. Da die Klassen, die ihre Funktionen in die Queue schreiben nicht, wie die Messagequeueklasse zugriff zu fast allen Klassen haben, muss die Funktion inline sein, geht das dann? Und zweitens: machts Probleme für std::list, dass Memberfunktionspointer Acht statt nur 4 Byte brauchen?
mfg und thx im Voraus
Glamdring
-
machts Probleme für std::list, dass Memberfunktionspointer Acht statt nur 4 Byte brauchen?
gegenfrage: kriegt list probleme, wenn du eine struct mit der größe 8Bytes angibst?
-
Wenn die list 8 Byte erwartet nicht. Da die List aber nur 4 Byte erwartet evtl. schon.
-
wieso sollte sie 4 Byte erwarten,wenn du die liste für methodenzeiger auslegst?
-
weil die Liste normale Funktionszeiger erwartet.
-
dann kannst du methodenzeiger eh vergessen(ich wollte dich schon im ersten post fragen, ob du dran gedacht hast^^)
-
Ich kenn mich mit Funktionspointer leider nicht so aus, wie muss die list heißen?
Ich habe (und glaube, dass es falsch ist):
std::list< void* >Und wie müsste die List heißen, wenns um Memberfunktionen geht (muss mir das mit Member oder normaler Funktion nochmal überlegen).
thx im Voraus
Glamdring
-
std::list<void (*) ()> mylist; //statische Funktion; std::list<void (T::*) ()> mylist; //Member-Funktion
-
Danke, aber ich hab noch ne Frage, habs versucht, aber nicht geschafft. Ich biete die Funktion push an:
void queuepush(void (ptr)()){Messagequeue.push(ptr);}
thx im Voraus
-
hier ein beispiel(ganz schnell zusammengeschrieben):
template<class Type,class Return> class functor{ private: typedef Return (Type::*function)(); function x; Type* object public: functor(Type* Object,function X):object(Object),x(X){} Return operator()(){ return object->x(); } }; template<class Type,class Return> list<functor<Type,Return> > a;
das ganze nent man functor, infos dazu unter mem_fun zb oder unter function-pointer.org
//edit wenn du nur void functions erwartest kannst du sogar dein object über ein Interface ansprechen, und damit auf alle Klassen und funktionen anwenden:
class baseFunctor{ public: virtual void operator()()=0; }; template<class Type> class functor:public baseFunctor{ private: typedef void (Type::*function)(); function pointer; Type* object; public: functor(Type* Object,function Funktion):object(Object),pointer(Funktion){} void operator()(){ object->pointer } };
-
Glamdrink schrieb:
Danke, aber ich hab noch ne Frage, habs versucht, aber nicht geschafft. Ich biete die Funktion push an:
void queuepush(void (ptr)()){Messagequeue.push(ptr);}
Was ist jetzt deine Frage?
-
Glamdrink schrieb:
Und wie müsste die List heißen, wenns um Memberfunktionen geht (muss mir das mit Member oder normaler Funktion nochmal überlegen).
Wie wäre es mit std::list<boost::function<void ()> >? Da passt dann jeder Funktor rein, den man über "()" aufrufen kann. Funktionszeiger also direkt und Elementfunktionen, wenn man etwas an sie gebunden hat (std::mem_fun oder gleich boost::bind). Siehe http://www.boost.org/.
-
@otze: Funktoren sind mir eigentlich zu übertrieben, brauch se nicht, wenn diese Funktion geht ist meine Klasse komplett.
@Shlo: Mein Compiler sieht as als Falsch, mit der Meldung:
'void (' unerwartet<<
@operator void: Gute Idee, das werde ich machen.
thx
-
void queuepush(void (*ptr)()){Messagequeue.push(ptr);}
-
Danke @ all, jetzt geht alles