struct zwischen Klassen weitergeben



  • sorry schickte nachricht ab bevor ich fertig war 😕



  • wahrscheinlich froward declaration



  • Funktioniert nicht - aha



  • Du dereferenzierst in deinem Beispiel eine nicht-Pointer variable.

    Struct keyword kannste in c++ weglassen bei Typ angaben.

    Poste die Fehlermessage - das ist was der Rest dir hier sagen will.



  • Das ist ja mein Problem. Es kommt keine Fehlermeldung, es funktioniert nur nicht. Vielleicht beschreibe ich es nochmal was ich gemacht habe.

    Meine Main in Klasse Time:

    struct Message{
    	int ID;
    	char Type[20];
    }message2;
    
    void main() {
            Forwarder(*message2);
    	system("PAUSE");
    }
    

    Meine Klasse Forwarder (quasi Client):

    Forwarder::Forwarder(struct Message * message2) {
    
    	//Initialise winsock
    	...
    	//create socket
    	...
    	//setup address structure
    	...
    	//start communication
    	while (1)
    	{
    		//send the message2
    		if (sendto(s, message2, strlen(message2), 0, (struct sockaddr *) &si_other, slen) == SOCKET_ERROR)
    		{
                    ...			
    		}
                    ... (Recieve Message = Antwort ob Nachricht ankam)
    	}
    	closesocket(s);
    	WSACleanup();
    }
    

    Leider kommt keine Fehlermeldung, der Client startet nur nicht. Ohne Übergabe des structs startet er.



  • Sicher dass der Compiler keine Fehlermeldung produziert? Ich kann ich mir kaum vorstellen, dass der Zeile 7 in deiner main-Datei einfach so kommentarlos schluckt.
    Eine übersehene Fehlermeldung des Compilers wäre übrigens auch eine plausible erklärung, weshalb der Client nicht startet.

    Finnegan



  • Hier ein Screenshot bei der Ausführung.
    Lediglich die Ausgaben der ID und des Typs "lol" sind zu sehen. Diese geschehen vor dem Aufruf des Forwarders. Es gibt zwar eine Warning, aber eben keine Fehlermeldung.

    http://www.fotos-hochladen.net/thumbnail/forwardernyqt045u91_thumb.jpg



  • Finnegan schrieb:

    Sicher dass der Compiler keine Fehlermeldung produziert? Ich kann ich mir kaum vorstellen, dass der Zeile 7 in deiner main-Datei einfach so kommentarlos schluckt.

    Dachte ich mir auch gerade. Nachdem das aber zu compilieren scheint habe ich es mal selbst ausprobiert. Die Zeile Forwarder(*message2); ruft gar keinen Konstruktor auf, sondern deklariert eine Variable! Es ist ein Pointer auf Forwarder mit dem Namen message2 (wenn man sich die unnötigen Klammern wegdenkt sieht man es).

    @CplusplusNeuling:
    Mach mal aus dem '*' mal ein '&' damit du deinen Konstruktor Aufruf kriegst.



  • Und n Bezeichner?

    Ist es nicht definiert statt deklariert? (Rein aus Interesse 🙄 )



  • Was für ein Bezeichner?

    Und ja sollte definiert heißen, nicht deklariert.



  • sebi707 schrieb:

    ... Die Zeile Forwarder(*message2); ruft gar keinen Konstruktor auf, sondern deklariert eine Variable! ...

    Ups! Das hätte ich jetzt nicht erwartet 😮 ... aber überraschend ist es bei der Sprache nicht. Das ist jetzt auch wieder so ein Ding wo man sich denkt, dass Uniform Initalization eigentlich eine gar nicht mal so verkehrte Idee ist 😃

    Finnegan


  • Mod

    Falls du tatsächlich mal ein allein stehendes, temporäres Objekt erstellen möchtest (auch bekannt als "meine Klasse sollte eigentlich eine freie Funktion sein"-Syndrom), das als Konstruktorparameter einen dereferenzierten Zeiger nimmt, kannst du dies auf folgende Arten und Weisen erreichen:
    a) Uniform initialization, wie von Finnegan erwähnt:

    Foo{*bar};
    

    b) Vor C++11 kann man mit ein paar Klammern Klarheit schaffen

    (Foo(*bar));
    


  • Danke für eure Antworten.
    Mit

    Forwarder{ &message2 };
    

    in Time startet jetzt der Client, leider kann ich mit den Eingaben des structs nicht arbeiten.

    Forwarder{ *message2 };
    

    kommt Fehler: Kein "*"-Operator stimmt mit diesen Operanden überein. Operandentypen sind: *Message.

    Forwarder:

    ...
    Forwarder::Forwarder(struct Message * message2) {
    
    	cout << &message2 << endl;  // Ausgabe: 0041FDB0
    	cout << message2 << endl;	// Ausgabe: 0133C144
    	cout <<  message2.ID;		// Fehler:	Ausdrck muss ein Klassentyp aufweisen
    	cout << message2.Type;		// Fehler:	Ausdrck muss ein Klassentyp aufweisen
    ...
    

    [code]

    Ich müsste das struct eigentlich an Receiver(Server) weiterleiten und erst dort damit arbeiten. Aber wenn ich nicht auf die Informationen des structs zugreifen kann nutzt das nichts. Muss ich da was anderes machen?

    (Warum ich so trouble mit Pointer und Co habe: Leider lernte ich C++ nicht, muss aber diese Sprache hierfür nutzen. Java wäre mir lieber)

    Gibt es ein allgemeines Beispiel wie ich ein struct in einer Klasse definiere und es dann an andere Klasse immer weiter geben kann um in der Zielklasse damit zu arbeiten?



  • Wenn du eine Klasse oder Struktur in verschiedenen Übersetzungseinheiten (ÜE) benötigst, so muß diese in einer gemeinsamen Headerdatei definiert sein.

    Statt des Zeigers kannst du auch einfach eine Referenz verwenden (das kommt der Java-Syntax näher):

    Forwarder::Forwarder(Message & message)
    {
       cout << message.ID;
    }
    

    PS: "strlen(message2)" ist Unsinn! Du willst wahrscheinlich

    sizeof(message2)
    

    (also die Größe der Struktur in Bytes)


Anmelden zum Antworten