globale Klassenvariable dynamisch



  • Moin,
    ich habe eine Klasse Tparameter erstellt, die SQL-Templates aufnehmen soll. Beim Öffnen des Fensters sollen die Templates aus der Datenbank gelesen werden. Dazu wird in einer Methode dieses Objekt erzeugt (Kostruktor is da).
    Ich arbeite mit dem C++Builder und habe dann im Header unter private eine Variable sqltemplates vom Typ Tparameter deklariert.

    Wenn ich das aber mache, meckert er:

    [C++ Fehler] reporte.cpp(17): E2279 Standardkonstruktor zur Initialisierung des Elements 'Treporteform::sqltemplates' nicht gefunden

    Jetzt könnte ich doch glaub ich den Konstruktor für sqltemplates beim Erzeugen des Forms aufrufen, aber ich will das Objekt ja erst beim Auslesen aus der DB haben und danach die Möglichkeit haben, es wieder zu löschen und neu zu erstellen.

    Wie mache ich das? Oder unterliege ich einem groben Denkfehler?



  • Zeig doch einfach mal den Code, dann können wir dir evtl weiterhelfen 🙂



  • Naja, da gibts net wirklich viel Code:
    Das ist in etwa meine Klasse, die hab ich vor der Form-Klasse im Header geschrieben (sind nochn paar andere Sachen dabei, aber die sind unwichtig):

    class Tparameter
    {
    protected:
     char ** params;
     char ** description;
     int * laenge;
     int anzahl;
    
    public:
     Tparameter(int count)
     {
      params = new char*[count];
      description = new char*[count];
      laenge = new int[count];
      anzahl=0;
     }
    }
    

    Und hier hab ichs dann deklariert:

    class Treporteform : public TForm
    {
     //[...]
     private:
      Tparameter sqltemplates;
     //[...]
    

    Sonst hab ich ja nix, außer meine Prozedur, aber die bringt mir ja noch nix, wenn ich das da oben nicht mal so kompilieren kann:

    delete sqltemplates;
     Query=Daten->IBtemp;
     Query->SQL->Text="SELECT * FROM sqltemplates";
     Query->Open();
     Query->FetchAll();
     sqltemplates= new Tparameter(Query->RecordCount);
     LBreports->Clear();
     while (!Query->Eof)
     {
      sqltemplates.addstring(Query->FieldByName("sql")->AsString.c_str());
      CBsqltemplates->Items->Add(Query->FieldByName("name")->AsString.c_str());
      Query->Next();
     }
    


  • Hallo,

    rufst du den CTor von 'Treporteform' auch richtig auf?

    Der muesste so aussehen:

    Treporteform::Treporteform(/*evtl. params*/)
      : sqltemplates(_Irgend_ein_Wert_)
    

    Denn einen Default-CTor hast du fuer Tparameter nicht definiert.

    mfg
    v R



  • Wie kann ich mehrere Konstruktoren aufrufen, denn ich habe ja schon für das Form:

    __fastcall Treporteform::Treporteform(TComponent* Owner)
            : TForm(Owner)
    

    Ein : sqltemplates dahinter stellen funktioniert ja nicht.

    Aber ich will ja auch nicht, dass die Instanz schon beim Create der Form erstellt wird, sondern ich will das selber machen.



  • Du ruftst im Code new und delete für Dein "sqltemplates" auf, und wenn ich Dich richtig verstanden habe willst Du erstellen und löschen von sqltemplates sowiso selbst kontrollieren. Dann definiere doch sqltemplates einfach als Zeiger:

    Tparameter* sqltemplates;
    

    Die Memberfunktionen mußt Du dann natürlich mit sqltemplates->funktion() aufrufen, und Du muß aufpassen, das Du vorher sqltemplates auch mit new erstellt hast.



  • Uwe82 schrieb:

    [blabla]
    Und hier hab ichs dann deklariert:

    class Treporteform : public TForm
    {
     //[...]
     private:
      Tparameter sqltemplates;
     //[...]
    

    Hast du den * vergessen, hm?

    Tparameter *sqltemplates;
    


  • Uuuups, jetzt isses natürlich klar, danke.
    *kopfaufdentischhau*



  • Sry, hab das "dynamisch" im Titel ueberlesen.

    mfg
    v R


Log in to reply