Dynamische Instanzierung



  • Halle Leute,

    isch hab da folgende Frache:

    mein qelltext enthält folgende code:

    Tabteilung *abtei;
    abtei = new Tabteilung("C:");
    

    und folgende fehlermeldungen gibt er mir aus:

    [C++ Fehler] ujobins.cpp(26): E2303 Typname erwartet
    [C++ Fehler] ujobins.cpp(26): E2238 Bezeichner 'abtei' mehrfach deklariert
    [C++ Fehler] ujobins.cpp(24): E2344 'abtei' bereits deklariert

    wasssee ische falsche makke 🙂 ?

    schonmal Danke im vorraus 😉

    Sven



  • Hast du die dazugehörige Header-Datei in der Cpp-Datei, in der die Klasse verwendet werden soll, inkludiert?



  • jup ... des habsch



  • Was ist mir den beiden anderen Fehlern? Bist du denen mal nachgegangen? Und zeig mal bitte den Code wo Tabteilung genutzt wird. Wie sieht die Deklaration von Tabteilung aus? Vielleicht hast du dich ja nur verschrieben?



  • Die letzte Fehlermeldung beziehen sich laut debugger nur auf diese 2 Zeilen Code.
    (die Fehlermeldung bezieht sich auf die erste und der rest auf die zweite).

    also Tabteilung wird eigentlich noch gar nicht genutzt

    hier die klasse:

    // struktur der vorhanden Abteilungen
    class Tabteilung
    {
     public:
     AnsiString name;
     AnsiString folder;
     vector<Tdocument*> doc;
    
     Tabteilung();
     Tabteilung(AnsiString path)
    
     {
    //----Auslesen der vorhanden Dokumente und in vector Speichern-----//
      DIR *dir;
      struct dirent *filename;
      AnsiString strfilename;
    
      dir = opendir(path.c_str());
    
      while((filename = readdir(dir)) != NULL)
    
                    {
    
                    if (strstr(filename->d_name, ".doc")!=0)
                    {
    
                    Tdocument *document= new Tdocument(NULL);
                    document->filename = filename->d_name;
    
                    doc.push_back(document);
                    }
    
                    }
     //----ENDE AUSLESEN-----------------------------------------------------//
     }
    
    };
    


  • tut mir leid für den einen push...

    ich brauch aber ehrlich ne antwort.....
    vielleicht findet sich ja noch jemand 😞



  • Beim Durchlesen kann ich an deinem Code nichts Falsches entdecken. Einzige was du ändern könntest, wäre das Wörtchen "struct" aus dem Konstruktor zu holen. Das ist nicht nötig.



  • Vielleicht sind mal wieder zirkuläre includes das Problem.
    Zeig doch mal die includes aller beteiligten *.cpp- und *.h-Dateien.
    Insgesamt habe ich den Eindruck, dass man mehr Code sehen müsste, um dem Problem auf die Schliche zu kommen.

    Gruß,

    Alexander



  • Ok, hier ist er:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include <dirent.h>
    #include <vector>
    using namespace std;
    
    #include "ujobins.h"
    #include "uconf.h"
    #include "data.h"
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    Tabteilung *abtei ;
    
    abtei = new Tabteilung("C:");
    

    in der data.h welche hier includet wird steht der code in meinem vorangegangen post drinne...



  • Alexander Kempf schrieb:

    Zeig doch mal die includes aller beteiligten *.cpp- und *.h-Dateien.

    Das ist jetzt (vermutlich) nur die *.cpp-Datei, in der der Fehler auftritt.
    Am besten wäre wahrscheinlich, Du würdest mal alle *.cpp- und *.h-Dateien zeigen, die irgendwie mit dieser *.cpp-Datei zusammenhängen.
    Zum Beispiel verwendest Du eine Klasse "Tdocument", deren Deklaration ich bisher noch nicht gesehen habe.
    Weißt Du was ich mit "zirkukären includes" (ich weiß nicht, ob das der offizielle Begriff dafür ist) meine?

    Gruß,

    Alexander



  • Dein Code steht im luftleeren Raum d.h. der Compiler hat keinen blassen Schimmer, wann die Anweisungen ausgeführt werden soll (unter der Annahme, das der von Dir gepostete Quellcode komplett ist).

    Versuch's mal damit ("Button auf die Form und doppelt anklicken" nicht vergessen):

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        Tabteilung *abtei ;
        abtei = new Tabteilung("C:"); 
    
        ....
    
        delete abtei;
    }
    


  • **
    ujobins.cpp :
    **

    standartzeugs:

    #include <vcl.h>
    #pragma hdrstop
    
    #include <dirent.h>
    #include <vector>
    using namespace std;
    

    der Rest der jobins.cpp:

    #include "ujobins.h"
    #include "uconf.h"
    #include "data.h"
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    
    Tabteilung *abtei ;
    
    abtei = new Tabteilung("C:");
    

    ujobins.h

    //---------------------------------------------------------------------------
    
    #ifndef ujobinsH
    #define ujobinsH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ComCtrls.hpp>
    #include <ImgList.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TListView *ListView1;
            TImageList *ImageList1;
            TButton *Button1;
            TButton *btn_config;
            TButton *Button2;
            TMemo *Memo1;
            void __fastcall btn_configClick(TObject *Sender);
            void __fastcall Button2Click(TObject *Sender);
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    uconf.h :

    //---------------------------------------------------------------------------
    
    #ifndef uconfH
    #define uconfH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class Tfrm_konf : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
    private:	// Anwender-Deklarationen
    public:		// Anwender-Deklarationen
            __fastcall Tfrm_konf(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE Tfrm_konf *frm_konf;
    //---------------------------------------------------------------------------
    #endif
    

    Die wohl hier relevante Datei:

    data.h :

    AnsiString rootpath;
    
    //Klasse für Dokumenteneinstellungen und Verteiler
    class Tdocument
    {
    
       public:
       AnsiString filename;
       vector<AnsiString> abteilung;
       void addabt(AnsiString);
       Tdocument(AnsiString file)
    
       {
        filename = file;
       }  // Standartkonstruktor
    
    };
    
    void Tdocument::addabt(AnsiString newabt)
    {
    abteilung.push_back(newabt);
    }
    
    // struktur der vorhanden Abteilungen
    class Tabteilung
    {
     public:
     AnsiString name;
     AnsiString folder;
     vector<Tdocument*> doc;
    
     Tabteilung();
     Tabteilung(AnsiString path)
    
     {
    //----Auslesen der vorhanden Dokumente und in vector Speichern-----//
      DIR *dir;
      dirent *filename;
      AnsiString strfilename;
    
      dir = opendir(path.c_str());
    
      while((filename = readdir(dir)) != NULL)
    
                    {
    
                    if (strstr(filename->d_name, ".doc")!=0)
                    {
    
                    Tdocument *document= new Tdocument(NULL);
                    document->filename = filename->d_name;
    
                    doc.push_back(document);
                    }
    
                    }
     //----ENDE AUSLESEN-----------------------------------------------------//
     }
    
    };
    


  • Killing me softly schrieb:

    Dein Code steht im luftleeren Raum d.h. der Compiler hat keinen blassen Schimmer, wann die Anweisungen ausgeführt werden soll (unter der Annahme, das der von Dir gepostete Quellcode komplett ist).

    Versuch's mal damit ("Button auf die Form und doppelt anklicken" nicht vergessen):

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        Tabteilung *abtei ;
        abtei = new Tabteilung("C:"); 
    
        ....
    
        delete abtei;
    }
    

    TOP, DANKE DANKE DANKE DANKE , daran hat es gelegen.. 👍 😋

    NUR wie kann ich mein erstelltes Objekt nun Global benutzen ?



  • Hast Du "Killing me softly"'s Vorschlag schon mal ausprobiert?
    Also gegenseitige includes kann ich nicht entdecken.
    Vielleicht hilft es ja auch die Deklaration und Instanzierung der Variablen zu kombinieren:

    Tabteilung *abtei = new Tabteilung("C:");
    

    Ich würde es allerdings bei mir ohnehin so machen, dass die Variablen (abtei, rootpath) Mitglieder einer Klasse wären.

    Gruß,

    Alexander

    Edit: Hat sich zum Teil schon erledigt.

    Zum anderen: Den Beitrag über public Variablen kennst Du?
    Du solltest drüber nachdenken, warum die Variablen überhaupt global sein müssen (vielleicht müssen sie das gar nicht).
    Ansonsten kannst Du das ja so ähnlich machen, wie es der BCB automatisch für Formulare macht.



  • vielen viel danke für eure hilfe...
    das hat mir auf jedenfall weitergeholfen....

    toll das es dieses forum gibt !!!!!!!!!! 👍 👍 👍 👍 👍


Anmelden zum Antworten