Initialisierung von Objekten im Kontruktor einer anderen Klasse.



  • Hallo.

    Ich habe folgendes Problem.
    Ich bereite die initialisierung von Instantzen von Objekten zum Programmstart im Klassenheader von TfMain (das hauptformular)
    [cpp]
    class TfMain : public TForm
    {
    __published: // Von der IDE verwaltete Komponenten
    irgendein Kram

    private: // Benutzer-Deklarationen
    **Procedur FileData; // Procedur Klassen Objekt wird initialisiert
    ***Parser FileContent; // Parser Klassen Objekt wird initialisiert
    **
    public: // Benutzer-Deklarationen
    __fastcall TfMain(TComponent
    Owner);
    __fastcall TfMain::~TfMain();
    };[/cpp]

    In der cpp Datei von TfMain ínitialisiere ich sie dann:

    __fastcall TfMain::TfMain(TComponent* Owner)
      : TForm(Owner)
      , FileData(), FileContent()
    {
    }
    

    Die Header der KLassen Parser und Procedur sehen so aus:

    class Parser
        {
        private:
        AnsiString Row;
        AnsiString FileContent;
    
        public:
        void SetRow (AnsiString ExtRow); // setzt Row
        AnsiString GetRow (void);        // liefert Row zurück
    
        void SetFileContent (AnsiString ExtFileContent);// setzt FileContent
        AnsiString GetFileContent (void);               // liefert FileContent zurück
    
        AnsiString ParseString (AnsiString ExtFileContent);
        AnsiString ParseString ();
        };
    

    und:

    class Procedur
      {
      private:
      vector<AnsiString> Data;
      vector<AnsiString>::iterator Iterator;
    
      public:
      void SetData(AnsiString ExtTest);
      AnsiString GetData (int Index);
      void DelData (int Index1, int Index2);
      void DelData (void);
      int GetDataSize();
      };
    

    Compiliere ich das Projekt jetzt bekomme ich folgende Fehlermeldung:
    Erzeugen
    [C++ Fehler] Parser.h(16): E2238 Bezeichner 'Parser' mehrfach deklariert
    [C++ Fehler] Parser.h(15): E2344 'Parser' bereits deklariert

    Ich brauche die Objekte fast zur geasmten Laufzeit, daher will ich sie zum Programmstart bei der Erzeugung von TfMain miterzeugen. Allerdings haut es mir immer besagten fehler um die Ohren. Ichhabe schon viel herumexperimentiert, komme aber einfach nicht weiter.
    Für Tips, oder andere Forlschäge das Ziel (Objekte nicht global initialisiert, aber dennoch immer verfügbar) zu erreichen wäre ich sehr dankbar!!!!!!!

    [ Dieser Beitrag wurde am 09.04.2003 um 11:40 Uhr von ClippingError editiert. ]



  • Parser.h(16), Parser.h(15)
    wo ist das?
    wie wäre ein singelton?
    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Singleton#Answ



  • *schäm*

    also hmm, ähhh, ich trau mich ja fast nicht es zu sagen, aber ich hatte vergessen zu überprüfen ob header datein nur einmal ins Projekt includiert werden (präprozessor anweisung)....

    singelton sieht interresant aus, das zieh ich mir mal rein. danke!



  • argh, jetzt haperts an anderer stelle....

    Die Header Datei (Parser.h) von Parser sieht in etwa so aus (ich habe sie der Übersicht halber verkürzt)

    #ifndef PARSECLASS_H    // Formaler Name der Header-Datei
    #define PARSECLASS_H
    
    #include "system.hpp"     // includiert die Header Datei welche für AnsiSting benötigt wird.
    #include <vector>            // inkludiert die Containerklasse "vektor"
    using namespace std;
    
    class Parser
        {
        private:
        vector<AnsiString> ParsedData;
    
        public:
        void SetParsedData (AnsiString ExtData);
        };
    
    #endif
    

    Die dazugehörende cpp sieht (ebenfalls gekürzt) so aus:

    #include "Parser.h"
    
    void SetParsedData (AnsiString ExtData)
      {
      ParsedData.push_back(ExtData);
      }
    

    Will ich das ganze jetzt kompilieren kommt die Fehlermeldung:
    Undefiniertes Symbol 'ParsedData'.

    Da ich die Parse.h ja in die Parse.cpp includiert habe kann ich mir dieses verhalten nicht erklären. Weiß jemand Rat???
    Danke



  • aua 🙄

    ein

    void Parser::SetParsedData (AnsiString ExtData)
      {
      ParsedData.push_back(ExtData);
      }
    

    wirkt doch manchmal wunder.....

    ist heut nicht mein tag.... :p


Anmelden zum Antworten