Struktur an Klasse übergeben



  • 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!



  • Ich nehme an, das deine Beschreibung korrekt ist.



  • Zum dritten Mal: Das ist möglich! Zeig mehr Code!



  • Hallo Blurry333,

    der Fehler steht doch daa. Das sind zwei unterschiedliche Typen.

    Warum genau willst du denn nicht das machen, was dir hier vorgeschlagen wird? Wenn du mal erklären würdest, warum, dann würde man eventuell nicht so in die Richtung drücken.



  • Hier mehr Code, das macht es aber nur noch unübersichtlicher.
    Hab bereits bei der Klasse Dateiverwaltung anstatt

    struct NLP_data_header_package *Header_data...
    

    versucht

    com::NLP_data_header_package *Header_data
    

    funktioniert aber auch nicht.

    Class com

    #ifndef COM_H
    #define COM_H
    //...
    #include "Dateiverwaltung.h"
    //...
    
    class com
    {
    private:
    
    Dateiverwaltung obj;
    //...
    public:
    
    int run(void);
    com(std::array<std::string,TWO> socket);
    ~com();
    
    struct NLP_data_header_package
    {
    	//...
    }NLP_data_recv;
    
    struct NLP_data_data_package
    {
            //...
    }recv_data_data;
    
    //...
    

    class com cpp file:

    //...
    if (recv_command == DATA_COMMAND)
    		{
    			obj.routine(ip_s.c_str(), &NLP_data_recv, &recv_data_data); //write to harddrive
    			obj.ext_close_file();
    
    		}
    //...
    

    Class Dateiverwaltung

    #ifndef DATEIVERWALTUNG_H
    #define DATEIVERWALTUNG_H
    
    //...
    #include "communication.h"
    //...
    public:
    	Dateiverwaltung(char* directory_global_re);
        ~Dateiverwaltung();  
    
    	int routine(std::string raw_data_re, struct NLP_data_header_package *Header_data, struct NLP_data_data_package *Data_data);
    	int ext_close_file(void);
    //...
    

    Class Dateiverwaltung cpp file

    //...
    int Dateiverwaltung::routine(string raw_data_re, struct NLP_data_header_package *Header_data, struct NLP_data_data_package *Data_data)
    {
    //...
    


  • LOL! Typischer Anfängerfehler: Cross-Include der Headerdateien (s. z.B. FAQ-Beitrag Wechselseitiger Zugriff auf Objekte).

    @KeinKredit: Du hast aber den Ratschlag, die Struktur(en) in eine eigene Datei auszulagern, nicht befolgt!

    Ein andere Alternative wäre, daß du die Strukturen in der Headerdatei "Dateiverwaltung.h" deklarierst (denn diese bindest du ja von der anderen Headerdatei "communication.h" ein).


Anmelden zum Antworten