Struktur an Klasse übergeben



  • Hi,

    ich habe zwei Klassen, die erste Klasse (com) ruft eine Methode einer andere Klasse (Dateiverwaltung) auf und will ihr eine Struktur übergeben. Die Struktur ist in beiden Klasse 1zu1 definiert.
    Wieso geht das nicht?
    Folgende Fehlermeldung:

    IntelliSense: Es ist keine passende benutzerdefinierte Konvertierung von " "com::NLP_data_header_package"" in ""Dateiverwaltung::NLP_data_header_package"" vorhanden.

    Aufruf:

    obj.routine(ip_s.c_str(),NLP_data_recv, recv_data_data); //write to harddrive
    

    Wie kriege ich es hin das ich benutzerdef. Strukturen zwischen Klassen austauschen kann?

    Danke!



  • Indem du dieselbe Strukturdefinition verwendest und nicht eine andere, die genauso aussieht.



  • ^ verstehe die Antwort nicht.

    In beiden Klasse ist die Strukt definiert 😞 ?
    Stehe auf einem großen Schlauch bitte ein kleines Beispiel!

    Gruß



  • KeinKredit schrieb:

    In beiden Klasse ist die Strukt definiert 😞 ?

    Eben. Das sind verschiedene Strukturen, auch wenn sie gleich aussehen.

    struct A { struct X{ int i; }; };
    struct B { struct X{ int i; }; };
    

    A::X ist etwas anderes als B::X.



  • Danke für die schnelle Antwort!

    Aber das kann ich ja schlecht ändern weil es eben zwei vers. Klassen sind?
    Dateiverwaltung und com.

    WIe lose ich dann das Problem?

    Danke Gruß



  • KeinKredit schrieb:

    Danke für die schnelle Antwort!

    Aber das kann ich ja schlecht ändern weil es eben zwei vers. Klassen sind?
    Dateiverwaltung und com.

    WIe lose ich dann das Problem?

    Danke Gruß

    Du musst das struct außerhalb der Klassen definieren und dann einfach das struct als Objekt der Klasse hinzufügen.

    Natürlich müssen beide Klassen das Struct kennen.

    struct mystruct{};
    
    class Dateiverwaltung{
    
    mystruct Alpha;
    };
    
    class com{
    
    mystruct Alpha;
    };
    


  • KeinKredit schrieb:

    Aber das kann ich ja schlecht ändern weil es eben zwei vers. Klassen sind?

    Wie folgt aus "es sind zwei Klassen" die Aussage "ich kann es nicht ändern"?

    Entweder verwendest du in Dateiverwaltung com::NLP_data_header_package (oder andersherum) oder du definierst NLP_data_header_package außerhalb beider Klassen.



  • Ja das verstehe ich, aber ich kann doch nicht eine unbekannte Struktur an eine Klasse übergeben?!

    Gruß



  • Warum sollte die Struktur unbekannt sein?
    Was bedeutet bei dir "verstehen"?



  • Kein Kredit schrieb:

    Ja das verstehe ich, aber ich kann doch nicht eine unbekannte Struktur an eine Klasse übergeben?!

    Gruß

    Bzgl. "Ja das verstehe ich" bin ich mir nicht so sicher.

    Man kann an eine Klasse keine unbekannte Struktur übergeben.
    Jede Klasse die die Struktur verwendet, muss das Struct irgendwoher kennen, aber das haben wir schon erwähnt.
    Was genau möchtest du jetzt wissen oder was genau ist noch nicht ganz klar?



  • Ich verstehe nicht wie ich das Problem lösen soll. Könnt ihr bitte mir ein kurzes Beispiel zeigen wie ich das Problem lösen kann?

    Man kann an eine Klasse keine unbekannte Struktur übergeben.
    Jede Klasse die die Struktur verwendet, muss das Struct irgendwoher kennen, aber das haben wir schon erwähnt.
    Was genau möchtest du jetzt wissen?

    Wie mache ich das ganze der Klasse bekannt!?

    Ich will eig. nur wissen wie ich das Problem lose?



  • KeinKredit schrieb:

    Ich will eig. nur wissen wie ich das Problem lose?

    Die Frage wurde schon mehrfach und vollständig beantwortet.



  • Auf die Gefahr mich zu wiederholen:

    Eine Lösung wäre das Struct außerhalb der beiden Klassen zu definieren.

    Ich gehe davon aus, dass deine beiden Klassen jeweils in einer eigenen *.hpp Datei sind.

    Wenn die beiden Klassen sich nicht kennen müssen:
    Dann kannst du das struct in eine eigene *.hpp Datei verschieben und diese dann entweder in die jeweiligen *.hpp Dateien der Klassen inkludieren oder du machst im Header vor den Klassen eine Forward Declaration des Structs.
    Dann musst du es nur noch in der *.cpp Datei der beiden Klassen inkludieren.

    siehe:

    //struct.hpp
    struct mystruct{};
    
    //Dateiverwaltung.hpp
    
    struct mystruct;
    class Dateiverwaltung{
    
    mystruct Alpha;
    };
    //dateiverwaltung.cpp
    #include "struct.hpp"
    
    //etc.
    

    oder:

    //struct.hpp
    struct mystruct{};
    
    //Dateiverwaltung.hpp
    #include "struct.hpp"
    
    class Dateiverwaltung{
    mystruct Alpha;
    };
    
    //com.hpp
    #include "struct.hpp"
    
    class Com{
    mystruct Alpha;
    };
    


  • KeinKredit schrieb:

    Wie mache ich das ganze der Klasse bekannt!?

    Indem irgendwo vor dem Code, der struct benutzt, ein include kommt.



  • Danke für die Antworten top 👍
    Leider ist das Problem immernoch nicht gelöst, ich kann die Klasse nicht in eine andeer Datei auslagern weil es sich bei den Klassen um jeweils einzelne Threads handelt.

    Also ich hab folgendes gemacht.

    Erste Klasse enthält die Strukturen.
    Die zweite Klasse hat ein include der ersten Klasse und die Deklaration und Definition der Methode für die Übergabe der Strukturen Pointer:

    int routine(std::string raw_data_re, struct NLP_data_header_package *Header_data, struct NLP_data_data_package *Data_data);
    

    Übergabe der Zeiger in der ersten Klasse:

    obj.routine(ip_s.c_str(), &NLP_data_recv, &recv_data_data); //write to harddrive
    

    😕 immernoch ein Fehler:

    IntelliSense: Das Argument vom Typ ""com::NLP_data_data_package *"" ist mit dem Parameter vom Typ ""NLP_data_data_package *"" inkompatibel.
    

    Ich verstehe einfach nicht wieso so etwas nicht funktioniert ?! 😡



  • Wie folgt aus "es handelt sich bei den Klassen um jeweils einzelne Threads" (was für sich genommen schon unsinnig ist) die Aussage "ich kann die Klasse nicht in eine andeer Datei auslagern"?



  • KeinKredit schrieb:

    Danke für die Antworten top 👍
    Leider ist das Problem immernoch nicht gelöst, ich kann die Klasse nicht in eine andeer Datei auslagern weil es sich bei den Klassen um jeweils einzelne Threads handelt.

    Diese Aussage macht jedenfalls für mich persönlich überhaupt keinen Sinn.
    Was hat denn die Klassendefinition mit Threads zu tun.

    Poste einfach mal in verkürzter Form deine beiden Klassendefinitionen, dein struct und wo du was machen willst.

    Ich glaube nicht, dass wir ansonsten hier weiterkommen.



  • ^ Hallo manni, vlt hab ich mich etwas falsch ausgedrückt. Aber die Auslagerung funktioniert so nicht.
    Jedenfalls verstehe ich einfach nicht WOOOOO der Fehler in meiner oberen Beschreibung ist.

    Wieso kann ich nicht einfach einen Pointer auf eine Klasse einer anderen Klasse übergeben die ebenfalls die erste Klasse als include besitzt?!

    Danke Gruß



  • KeinKredit schrieb:

    ^ Hallo manni, vlt hab ich mich etwas falsch ausgedrückt. Aber die Auslagerung funktioniert so nicht.

    Wieso nicht, dass MUSS funktionieren, wir sind hier nicht bei Outer Limits.

    Poste einfach mal in verkürzter Form deine beiden Klassendefinitionen, dein struct und wo du was machen willst.

    Ich glaube nicht, dass wir ansonsten hier weiterkommen.



  • ^Nein das Funktioniert so nicht. Ich will/kann die Daten nicht auslagern.

    Könnt ihr mir bitte erklären was an der oberen Beschreibung falsch ist. Danke!


Anmelden zum Antworten