Hallo Forum,
Ich verstehe mal wieder die Welt nicht.
Ich konnte mittels Debugger nach verfolgen, dass hier zuerst
onDestroy(this, onDestroyAccessor) aufgerufen wird und erst
anschliessend onDestroyAccessor(). Und das sowohl in einer richtigen
Klasse, als auch in dieser Testklasse. WARUM???
1 | class Test {
|
2 | public:
|
3 | EventHandle<Test> onDestroy;
|
4 |
|
5 | Test() :
|
6 | onDestroyAccessor(),
|
7 | onDestroy(this, onDestroyAccessor) {
|
8 | printf("Test()\n");
|
9 | }
|
10 |
|
11 | void destroy() {
|
12 | onDestroyAccessor.trigger();
|
13 | }
|
14 |
|
15 | private:
|
16 | EventHandle<Test>::Accessor onDestroyAccessor;
|
17 | };
|
18 |
|
19 | int main() {
|
20 | Test test;
|
21 | test.destroy();
|
22 | }
|
Ausschnitt aus der EventHandle-Klasse:
1 | template <class T>
|
2 | class EventHandle {
|
3 | public:
|
4 | class Accessor;
|
5 | friend class Accessor;
|
6 |
|
7 | EventHandle(T *const obj_, Accessor &accessor_) : obj(obj_) {
|
8 | accessor_.assignHandle(this);
|
9 | };
|
10 | // ... etc...
|
11 | }
|
12 |
|
13 | template <class T>
|
14 | class EventHandle<T>::Accessor {
|
15 | public:
|
16 | friend EventHandle;
|
17 | Accessor() : event_handle(nullptr) { }
|
18 |
|
19 | private:
|
20 | void assignHandle(typename EventHandle::ptr_t event_handle_) {
|
21 | // assert(!event_handle); <--- schlägt fehl weil constructor nicht aufgerufen wurde!
|
22 | event_handle = event_handle_;
|
23 | }
|
24 |
|
25 | virtual void trigger() {
|
26 | // assert(event_handle); <--- schlägt ebenfalls fehl, weil der constructor
|
27 | // event_handle anschliessend wieder auf nullptr gesetzt hat.
|
28 | event_handle->trigger();
|
29 | }
|
30 | // ... etc...
|
31 | }
|
Vielen Dank schon mal für jeden Kommentar.