Seite 1 von 1

Callbacks

Verfasst: So Mär 28, 2010 9:53 pm
von hackmack
Hi,

wenn ich bspw. folgenden Aufbau habe:

Code: Alles auswählen

class k3;

class k2
{
	private:
		k3 k3_obj;
};

class k1
{
	private:
		k2 k2_obj;
	public:
		void callback()
};
Jetzt passiert in k3 irgendetwas wichtiges, worüber k1 gerne informiert sein würde, deswegen ruft es die Funktion callback() auf. Bloß wie mach ich das mit dem Callback am besten?

main.cpp

Code: Alles auswählen

#include <iostream>
#include "main.h"
using namespace std;

k3::k3(k1 *grand_parent)
{
    this->k1_ptr = grand_parent;
    this->irgendetwas_wichtiges();
}
void k3::irgendetwas_wichtiges()
{
    this->k1_ptr->callback();
}
k2::k2(k1 *parent) : k3_obj(parent)
{
}
void k1::callback()
{
    cout << "Callback wurde aufgerufen" << endl;
}
k1::k1() : k2_obj(this)
{
}

int main()
{
    k1 temp;
    return 0;
}
main.h

Code: Alles auswählen

class k1;

class k3
{
	private:
		k1 *k1_ptr;
	public:
		k3(k1 *grand_parent);
		void irgendetwas_wichtiges();
};

class k2
{
	private:
		k3 k3_obj;
	public:
		k2(k1 *parent);
};

class k1
{
	private:
		k2 k2_obj;
	public:
        k1();
		void callback();
};
So wie oben, dass ich einfach einen Pointer von k1 übergebe; oder gibt es da bessere Lösungen?

Mfg.
hackmack

Re: Callbacks

Verfasst: So Mär 28, 2010 10:23 pm
von Xin
Das ist im Prinzip genau das, was Du dann tun musst. ^^

Wenn Du aus dem K1 Zeiger noch eine Liste von K1-Zeigern machst, hast Du komplettes Eventing abgebildet. Zusätzlich kannst Du noch Methodenzeiger verwenden, dann kannst Du sogar zwischen den Methoden auswählen, die Du aufrufen willst, kannst also k1-Objekte unterschiedlich informieren.

Solange es nur ein K1-Objekt gibt, ist Dein Vorgehen aber optimal.

Re: Callbacks

Verfasst: Mo Mär 29, 2010 7:10 pm
von hackmack
Wie meinst du das mit dem komplettem Eventing? Was wäre bspw. an Anwendungsfall dafür?

Re: Callbacks

Verfasst: Mo Mär 29, 2010 10:55 pm
von Xin
hackmack hat geschrieben:Wie meinst du das mit dem komplettem Eventing? Was wäre bspw. an Anwendungsfall dafür?
Ziehst Du das voll durch, hast Du keinen Callback-Pointer, sondern eine Liste, die Callback-Objekte enthält.

Die Liste z.B. enthält alle Objekte, die beim Event 'MouseClick' informiert werden wollen. Jedes Objekt hat eine Funktion 'OnMouseClick( int x, int y, short buttons )'. Wer immer wissen will, wann eine Maustaste gedrückt wird, trägt sich in die Liste ein und wenn jemand die Maus klickt, wird ein Objekt nach dem anderen darüber informiert.
Das läuft im Prinzip genauso ab, wie Du es für ein einzelnes Callback-Objekt beschrieben hast.