2. VCL-Konstruktor erstellen?



  • Hi,

    also ich habe folgende Klasse:

    class PACKAGE TMyKlasse : public TOrgKlasse
    {
    private:
    protected:
    public:
        int iId;
        __fastcall TMyKlasse(TComponent* Owner);
        __fastcall TMyKlasse(TComponent* Owner, int ID);
        __fastcall ~TMyKlasse();
    };
    

    mit

    __fastcall TMyKlasse::TMyKlasse(TComponent* Owner)
        : TOrgKlasse(Owner)
    {
        //massig befehle
    }
    __fastcall TMyKlasse::TMyKlasse(TComponent* Owner, int ID)
    {
            TMyKlasse(Owner);
            iId = ID;
    };
    

    Das funktioniert aber so nicht, da BCB keinen Standardkonstruktor findet!
    Muss ich den Standardkonstruktor irgendwie kennzeichnen oder ist die Vorgehensweise völlig falsch? Jedenfalls brauch ich wirklich 2 Konstruktoren, da verschiedene Parentklassen unterschiedlich initialisieren.

    Mfg
    Surillium



  • Du hast mehrere Fehler in deinem Code:

    1. Der 2. Konstruktor ruft nicht die Basisklasse "TOrgKlasse" auf

    2. Der Aufruf "TMyKlasse(Owner);" erzeugt einfach nur ein temporäres Objekt
    (bei C++ kann man nicht von einem Konstruktor einen anderen aufrufen)

    Es gibt zwei Möglichkeiten, dies zu lösen:

    1. eine allgemeine Init-Methode, die von beiden Kosntruktoren aufgerufen wird

    __fastcall TMyKlasse::TMyKlasse(TComponent* Owner)
        : TOrgKlasse(Owner)
    {
        Init();
    }
    __fastcall TMyKlasse::TMyKlasse(TComponent* Owner, int ID)
        : TOrgKlasse(Owner)
    {
            iId = ID;
            Init();
    };
    
    void TMyKlasse::Init() // evtl. sogar mit Parametern
    {
        // ...
    }
    

    oder

    2. nur einen Konstruktor definieren, der aber einen Defaultwert enthält, z.B.

    __fastcall TMyKlasse(TComponent* Owner, int ID = 0);
    


  • Hallo,

    Du mußt den Konstruktor der Basisklasse in der Initialisierungsliste aufrufen. Du kannst einen Konstruktor nicht direkt aufrufen.

    __fastcall TMyKlasse::TMyKlasse(TComponent* Owner)
        : TOrgKlasse(Owner)
    {
        //massig befehle
    }
    __fastcall TMyKlasse::TMyKlasse(TComponent* Owner, int ID) : TOrgKlasse(Owner)
    {
            iId = ID;
    };
    

    [edit]Zu spät.[edit]



  • Danke! 😃

    Die Variante mit dem Defaultwert passte für mein Fall perfekt!


Anmelden zum Antworten