Struktur in verschiedenen Klassen nutzen



  • Ich möchte in einer Datenklasse eine Struktur definieren. Z.B.:

    class Daten
    {
        struct structMeldung
        {
            int iMeldeBit;
            AnsiString ASMeldeArt;
            AnsiString ASMeldeBit;
        };
    }
    

    Jetzt soll diese Struktur an eine Methode einer anderen Klasse übergeben werden.
    Z.B.

    void MeldungEintragen(structMeldung Nachricht)
    {
    ...
    }
    

    Aber so ist die Struktur natürlich in der anderen Klasse gar nicht bekannt. Eigentlich würde es doch reichen, wenn ich die Struktur außerhalb der Klasse Daten definiere, aber da bekomme ich den Fehler
    [BCC32 Fehler] meld.h(26): E2293 ) erwartet.
    Wo liegt da der Fehler?



  • Ich habe eine Lösung gefunden:

    Die Stuktur kann doch innerhalb der Klasse Daten definiert werden.
    Jedoch muss an die Methode "MeldungEintragen" das struct etwas anders übergeben werden:

    EintragHinzufuegen(TDaten::structMeldung ASMeldung)
    {
    ...
    }
    

    Ich habe die Struktur in meinem Fall als Zeiger übergeben. Das sieht dann folgendermaßen aus:

    EintragHinzufuegen(TDaten::structMeldung* ASMeldung)
    {
    ...
    }
    

    und der Aufruf der Methode sieht dann so aus:

    EintragHinzufuegen(&Daten->Meldung);
    


  • Ich bin der Meinung, wenn die Struktor in mehreren Klassen verwendet werden soll, sollte sie auch außerhalb der Klassen definiert werden.
    Ich vermute, Du hast tatsächlich nur irgendwo ein Semikolon, oder tatsächlich eine schließende Klammer vergessen. Wie sah der Code den genau aus, als der Fehler kam und in welcher Zeile wurde der Fehler angezeigt.



  • Das hatte ich in der Header-Datei von der Datenklasse außerhalb der Klasse Daten stehen.

    struct structMeldung
    {
        int iMeldeBit;
        AnsiString ASMeldeArt;
        AnsiString ASMeldeBit;
    };
    

    In der Header-Datei der "anderen" Klasse (Benennung aus dem ersten Beitrag) hatte ich das:

    EintragHinzufuegen(structMeldung* ASMeldung);
    

    Dann habe ich beim Compilieren aber die genannte Fehlermeldung hinter der Struktur "structMeldung" erhalten.



  • Der gezeigt Code ist soweit in Ordnung. Könntest Du mal die gesamte Headerdatei bis einschließlich der Deklaration der Struktur zeigen?



  • //---------------------------------------------------------------------------
    
    #ifndef datenH
    #define datenH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ADODB.hpp>
    #include <DB.hpp>
    #include "ADOX_OCX.h"
    #include <OleServer.hpp>
    #include <msxmldom.hpp>
    #include <XMLDoc.hpp>
    #include <xmldom.hpp>
    #include <XMLIntf.hpp>
    #include <string>
    
    using namespace std;
    
    //---------------------------------------------------------------------------
    class TDM_Daten : public TDataModule
    {
    __published:	// IDE-verwaltete Komponenten
    	TADOConnection *ADOConnectionRW;
    	TADOXCatalog *ADOXCatalog;
    	TDataSource *ADO_DataSource;
    	TXMLDocument *XMLDocument;
    private:	// Benutzer Deklarationen
    public:		// Benutzer Deklarationen
    	__fastcall TDM_Daten(TComponent* Owner);
    	structMeldung MeldungDW40[16];
    };
    
    // Störmeldungen
    struct structMeldung
    {
    	int iMeldeBit;
    	AnsiString ASMeldeArt;
    	AnsiString ASMeldeBit;
    };
    
    //---------------------------------------------------------------------------
    extern PACKAGE TDM_Daten *DM_Daten;
    //---------------------------------------------------------------------------
    #endif
    


  • structMeldung sollte vor TDM_Daten deklariert werden, da es darin ja verwendet wird.



  • Du musst die Strukur vor der Klasse definieren, in der Du sie verwenden willst.
    Also die strukturdeklatarion dorthin schieben, wo das using namespace std steht.

    Wofür soll eigentlich dieses using namespace std sein? So etwas macht man nicht im Header.

    [EDTI] Ich sollte mir angewöhnen zu schauen, ob schon jemand was gepostet hat, wenn ich zwischendurch noch telefoniere...



  • Damit ich auch in der Header-Datei normale string-Variablen verwenden kann, verwende ich den namespace std.
    Ich könnte auch vor jede string-Variablendeklaration std::string schreiben, aber das spare ich mir



  • CHLINDE schrieb:

    Damit ich auch in der Header-Datei normale string-Variablen verwenden kann, verwende ich den namespace std.
    Ich könnte auch vor jede string-Variablendeklaration std::string schreiben, aber das spare ich mir

    Das macht man in der Implementationsdatei, nicht in der Header Datei. Das mag in deinem Fall gutgehen, aber bei grösseren Projekten, insbesondere bei denen, an denen mehrere Entwickler arbeiten, ist das tabu. Das folgende Beispiel ist zwar nicht praxistauglich, erklärt das Problem aber ziemlich gut:
    Programmierer Eins schreibt eine tolle Klasse und benutzt im Header die Direktiven

    #include <string>
    using namespace std;

    Im aktuellen Kontext führt das zu keinen Problemen und er spart sich die lästige Vollqualifizierung der Klasse std::string.
    Programmierer Zwei benötigt nun die Klasse und bindet deren Header ein. Dummerweise hat Programmierer zwei selbst eine String Klasse namens string implementiert, aber aufgrund des eingebundenen Headers kommt es jetzt zu Namenskonflikten, weil der Compiler nicht mehr weiss, ob er die selbstprogrammierte Klasse string oder std::string benutzen soll.

    PS:
    Wenn du schon die STL benutzt, warum dann nicht auch einen Standardcontainer zum Verwalten der structMeldung statt eines statischen Arrays?

    PPS:
    Warum bindest du string überhaupt ein? In deinem Codeschnipsel sehe ich nur AnsiString, wo wird std::string denn überhaupt benötigt?

    PPPS:
    Benutze Zeiger auf Objekte nur dann, wenn NULL ebenfalls ein zulässiger Wert ist (d.h. NULL auftreten kann und keinen Fehler bedeutet). Wenn dein Design voraussetzt, dass der Zeiger niemals NULL ist dann verwende besser (const) Referenzen statt Zeiger.

    Gruß,
    Doc


Anmelden zum Antworten