001
23.09.2003, 18:52 Uhr
0xdeadbeef
Gott (Operator)
|
Zum 1. Ansatz: Ich sehe das Problem mit zirkulären Referenzen nicht. Solange du keinen schlecht programmierten Garbage Collector benutzt, dürftest du damit keine Probleme haben. Was den zweiten Punkt angeht - taken, aber in den meisten Fällen haben die möglichen Owner für den Member, wenn man Callback-Funktionen benutzt (was meistens dann passiert, wenn die Dinger eigentlich eine Einheit bilden), zumindest eine ähnliche Struktur. Beispielsweise werden GUI-Controls meistens in Dialogen oder zumindest entsprechenden Containerklassen verwendet, ein gut durchdachter Klassenbaum löst hier die meisten Probleme.
Wenn der erste Ansatz nicht machbar ist - naja, den zweiten halte ich für nicht sonderlich gelungen. Man kann pointer auf Member-Funktionen durch die Gegend reichen, aber idR versaut man durch sowas den Code. Sinnvoller ist Ansatz 3, der ziemlich laut "FUNKTOREN" schreit. Funktoren sind im wesentlichen Klassen, die den operator() überladen, und die dementsprechend wie normale Funktionen aufgerufen werden können. Dadurch, dass es Objekte sind, kannst du die spezielle Funktionalität, die gecallbackt wird, wunderbar kapseln. Ein etwas widerliches Beispiel:
C++: |
class basis_funktor { public: void operator() = 0; }
class owner;
class konkreter_funktor { protected: owner *parent; public: konkreter_funktor(owner*); void operator(); }
class member { protected: konkreter_funktor &callback; public: member(konkreter_funktor&); void trigger_callback(); }
class owner { protected: member mb; konkreter_funktor called_back_fktr; int i; public: owner(); }
konkreter_funktor::konkreter_funktor(owner *p) : parent(p) { } void konkreter_funktor::operator()() { parent->i++; }
member::member(konkreter_funktor& cb) : callback(cb) { } void member::trigger_callback() { callback(); } //führt calback.operator()() aus.
owner::owner() : i(0), called_back_fktr(this), mb(called_back_fktr) { }
|
-- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 23.09.2003 um 18:52 Uhr von 0xdeadbeef editiert. |