PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++/QT; callback-function an function übergeben?



dipesh
31-07-2003, 15:58
Der function myfunc() soll eine andere function myref() als Paramater übergeben werden. myfunc() befindet sich in einer Klasse und soll sich myref() merken um es einer anderen function myotherfunc() zu ermöglichen myref() zu einem späteren Zeitpunkt aufzurufen.

So in etwa ist die Ausgangslage. Um etwas weiter auszuholen;
myfunc() soll sich übergebene myref()'s in einer QMap merken. Wird myotherfunc() dann aufgerufen, muss hier nur aus der QMap die passende myref() rausgesucht und aufgerufen werden.

Wie müsste der functions-rumpf von myfunc() den aussehen um eine solche Referenz auf eine function annnehmen und weiterverarbeiten zu können?

Danke im voraus für jeden Tip/Anmerkung/Anregung! :-)

anda_skoa
31-07-2003, 16:01
Ist das eine C Funktion, die das dann aufruft? Also einC Callbackmechanismus?

Wenn ja, wie sieht da die Signatur aus, wenn nein, warum kein Interface?

Ciao,
_

dipesh
02-08-2003, 04:54
Ist das eine C Funktion, die das dann aufruft? Also einC Callbackmechanismus?

Ja. Es handelt sich um einen einfachen callback.


Wenn ja, wie sieht da die Signatur aus, wenn nein, warum kein Interface?

Mit Signatur meinst du sicherlich jenes, was ich vorher als Funktionsrumpf titulierte. Da könnte es etwas der Art
void mymessage(QStringList sl);
sein. Ein Interface ist nicht nötig, weil die übergebene function eigentlich stets gleich aussieht.

Die Frage ist auch ziemlich banal (nämlichdie nach dem richtigen Syntax). Nur leider in keinem meiner C/C++ Handbücher genauer erläutert.

Müsste doch irgendwie so aussehen?!;
void mymessage(QStringList sl);
void myfunc( void mymessage(QStringList) );
void myotherfunc() {
...
myrememberedmessage(sl);
}

Einen Link zu einer guten Online-Ressource zum Thema oder auch nur ein Beispiel-Quellcode in welchem soetwas umgesetzt wurde würden schon vollkommen aussreichen :-)

anda_skoa
02-08-2003, 10:53
Original geschrieben von dipesh
Mit Signatur meinst du sicherlich jenes, was ich vorher als Funktionsrumpf titulierte. Da könnte es etwas der Art
void mymessage(QStringList sl);


Das kannst du sicher nicht an einen C Callback übergeben, weil QStringList ein C++ Konstrukt ist.

Aber ich meinte die Funktion, der man die Callback Funktion übergeben soll, denn die bestimmt schliesslich auch die Signatur des Callbacks selbst.

Die Funktion wird ja wohl in einem Header deklariert sein, oder?



Ein Interface ist nicht nötig, weil die übergebene function eigentlich stets gleich aussieht.


Das ist ja bei einem Interface auch der Fall.



Müsste doch irgendwie so aussehen?!;
void mymessage(QStringList sl);
void myfunc( void mymessage(QStringList) );
void myotherfunc() {
...
myrememberedmessage(sl);
}


eher
void myfunc(void* callback(QStringList))
oder so ähnlich, aber diese Funktion wird ja schon von der C Bibliothek definiert sein, auch wenn ich mir nicht vorstellen kann, welche C Bibliothek einen QStringList Parameter verwenden sollte.

Ciao,
_

dipesh
02-08-2003, 21:27
Das kannst du sicher nicht an einen C Callback übergeben, weil QStringList ein C++ Konstrukt ist.

Ja. Ebendrum auch der Titel des Beitrages (C++/QT). Entschuldige, hab deine erste Antwort wohl falsch verstanden und entspr. falsch beantwortet. Es handelt sich natürlich _nicht_ um eine C-Funktion. Es wird aber wohl unter C++ ebenfalls einen Callback-Mechanismus geben?


Aber ich meinte die Funktion, der man die Callback Funktion übergeben soll, denn die bestimmt schliesslich auch die Signatur des Callbacks selbst.
...
void myfunc(void* callback(QStringList))
oder so ähnlich, aber diese Funktion wird ja schon von der C Bibliothek definiert sein, auch wenn ich mir nicht vorstellen kann, welche C Bibliothek einen QStringList Parameter verwenden sollte.


*gg* Danke für den Hinweis auf das fehlende * nach dem void. Werd ich gleich morgen früh testen!

anda_skoa
02-08-2003, 23:42
Original geschrieben von dipesh
Ja. Ebendrum auch der Titel des Beitrages (C++/QT). Entschuldige, hab deine erste Antwort wohl falsch verstanden und entspr. falsch beantwortet. Es handelt sich natürlich _nicht_ um eine C-Funktion. Es wird aber wohl unter C++ ebenfalls einen Callback-Mechanismus geben?


Klar, ganz fein über Interfaces :)



class CallbackInterface
{
public:
virtual void doSomething(const QStringList& list) = 0;
};

class Implementor : public CallbackInterface
{
public:
void doSomething(const QStringList& list)
{
qDebug("list has %d entries", list.count());
}
};

class Caller
{
public:
void addCallback(CallbackInterface* callback)
{
if (callback != 0) m_callbacks.append(callback)
}

void callAll(const QStringList& list)
{
for (uint i = 0; i < m_callbacks.count(); ++i)
m_callbacks.at(i)->doSomething(list);
}

private:
QPtrList<CallBackInterface> m_callbacks;
}


In Qt kann man Callbacks auch mit Signal/Slots realiserern, wenn die Reihenfolge der Aufrufe nicht wichtig ist.
Dazu definiert man einfach ein entsprechendes Signal und alle interesierten Klassen connecten entsprechende Slots drauf.

Ciao,
_

dipesh
03-08-2003, 03:03
Danke! Danke! Für diese ausführliche Beispiel. Da sieht man mal, was man davon hat sich jahrelang mit dem Windows-API rumgeschlagen zu haben; jede Menge an Ideen um einfachste Aufgabenstellungen unnötig zu verkomplexizieren
:rolleyes: