SIGNAL & SLOT Marke Eigenbau
-
Das die das bei Qt nich so machen hab ich mir gedacht.. Wäre ja auch zu einfach

Ich kriegs aber immer noch nicht zum laufen.. Was mach ich falsch?
-
Welche fehlermeldung kommt?
Geh mal mit dem Debugger drüber.
-
Compiler sagt:
1>c:\dokumente und einstellungen\besitzer\eigene dateien\visual studio 2008\projects\XXX\XXX\XXX.hpp(12) : error C2027: Verwendung des undefinierten Typs "Main" 1>c:\dokumente und einstellungen\besitzer\eigene dateien\visual studio 2008\projects\XXX\XXX\XXX.hpp(12) : error C3861: "foo": Bezeichner wurde nicht gefunden.Beide Fehler in Zeile 13.
Aber kp warum.. Ich verweise doch aus Main..?
-
In Zeile 12 kann der Compiler noch nicht wissen, dass die Klasse Main mal eine Funktion foo haben wird.
-
Wie kann ich ihm das denn sagen?
Ich steh grad irgendwie aufm Schlauch

-
Trenne Memberdeklaration von Memberdefinition. Sprich: Teil die Klasse auf in Header und Implementierungsdatei.
-
Danke jetzt funktionierts..

Aber auch nur wenn ich foo() als static deklariere..
Geht das noch anders? Ich hätte gerne, dass in das aktuelle Objekt von Main engegriffen wird..
-
Du solltest wissen, was du tust, und nicht einfach ausprobieren.
staticsetzt man nicht hin, "damit es funktioniert", sondern weil man damit eine bestimmte Semantik erreichen möchte.Michael E. hat ja schon gesagt, was du tun sollst. Die Trennung von Header und Implementierungsdatei sollte auch in jedem Anfängerbuch erläutert sein. Ausserdem wirst du im Internet massenhaft Erklärungen dazu finden.
-
Mir ist sehr wohl bekannt was man mit einem static bezweckt.. Aber ohne geht es nicht, auch nicht durch die Trennung in Header und
Implementierungsdatei:1>c:\dokumente und einstellungen\...\signal.cpp(12) : error C2352: 'Main::foo': Unzulässiger Aufruf einer nicht statischen Memberfunktion
-
NEO.PIXEL schrieb:
Mir ist sehr wohl bekannt was man mit einem static bezweckt..
Dann wüsstest du aber, dass man zum Aufruf einer nicht-statischen Memberfunktion ein Objekt benötigt. Das hast du bei
Main::foo()nicht.
-
Das weiß ich wohl, aber dazu müsste ich x global anlegen und das hatte ich so eigentlich nicht geplant..
Oder komme ich noch irgendwie anders an das Objekt ran??Ich bin verwirrt

-
Das Objekt kannst du ja an
BASEim Konstruktor übergeben und dann speichern (evtl. als Zeiger/Referenz).Übrigens: Zu Signal-Slot-Systemen könntest du dir auch
boost::functionundboost::signalsanschauen...
-
So könnte is gehen

Dann probier ich mal und lass von mir höre wenns läuft..
Danke für die Hilfe

-
So.. Wie angedroht wollte ich mich ja melden wenns läuft:

// signal.hpp #pragma once #include <iostream> class Main; class BASE { typedef Main& SLOTCLASS SLOTCLASS sltc; public: BASE(SLOTCLASS sc) : sltc(sc) {} void operator()(int i); }; typedef BASE SLOT; typedef BASE& SIGNAL; class Make { public: Make(SIGNAL SI) : signal(SI) {} SIGNAL signal; }; class Main { int x; public: Main(void) : slot(*this), x(7) {} SLOT slot; void foo(int i) { x += i; std::cout<<"SIGNAL WORKS "<<x<<std::endl; } }; // signal.cpp void BASE::operator ()(int i) { main.foo(i); } // main.cpp #include "signal.hpp" int main() { Main x; Make y(x.slot); y.signal(35); system("pause"); }Fänd es jetzt aber noch schön für BASE ein Template zu haben, um Zeile 10 allgemeiner gestallten zu können.. Ist das irgendwie möglich?