Eigene TImage - Probleme beim Constructor



  • Hallo, habe das FAQ durchfoscht und keinen Eintrag gefunden.

    Also ich habe schon desöfteren eigene Klassen aus VCL C. abgeleitet doch stets das mit dem Contructor nicht so ganz verstanden.

    Wenn ich eine eigene unabgeleitete KLasse, heisst mein Constructor wie die Klasse und ich kann entsprechend Argumente übergeben

    class myclass
    {
    public:
       myclass(..);
    .
    .
    .}
    

    Leite ich dir Klasse jedoch von einer anderen Classe ab, die auch ein Argument(Bei VCL desöfteren den Owner) besitzen, komme ich nicht ganz hinter die Syntax und den Sinn/Ausbaue

    class myImage : public TImage
    { 
    public:
       myImage(TComponent *aOwner) : TImage( aOwner );
    .
    .
    .
    }
    

    Nun bringe mir der Compiler einen Fehler :

    [C++ Fehler] myImage.h(19): E2113 Virtuelle Funktion 'myImage::myImage(TComponent *)' verursacht Konflikte mit der Basisklasse 'TImage'

    Kann mir jemand erklären, was die genau zu bedeuten hat ?
    Eine virtuelle methode wird doch dann deklariert, wenn man davon ausgeht, das sie bei der Ableitung "overloaded" wird, oder ?

    Danke



  • Also mit

    __fastcall myImage(TComponent *aOwner) : TImage( aOwner ){};
    

    Hat es dann funktioniert, aber nur wenn Deklaration und Implementierung im Header stehen. Wieso ist das so ?

    Ich das ich den Constroctor mit __fastcall deklariert habe, sorgt wie bei Closures dafür, das sie mit dem Contructor der TImage Klasse übereinstimmt ?

    ich könnte natürlich nun der Sache so begegnen

    __fastcall myImage(TComponent *aOwner) : TImage( aOwner )
    {
    this->constructor(aOwner)
    };
    

    Aber warum verstehe ich nicht.

    DAnke



  • Hallo

    du hast das __fastcall vergessen. Da das ein Modifizierer ist, kann der Compiler nicht deinen Konstruktor vom bestehenden ableiten. Richtig muß es also heißen :

    // Header
    __fastcall virtual myImage(Classes::TComponent* AOwner);
    
    // CPP-Datei
    __fastcall myImage::myImage(Classes::TComponent* AOwner) : TImage( aOwner )
    {
      }
    

    bis bald
    akari



  • Danke dir.

    Folgendes:
    Der Unterschied zu meinem letzen Beitrag ist, das du den Constructor des TImage VCLs nicht im Header ansprichst. Wieso ?
    Irgendetwas hab ich da gründlich falsch verstanden.

    Du deklarierst den myImage Contructor virtuel, damit er vom Timage contructor overloaded wird/werden kann und bei der Implementation overloadest du dann doch den TImage contructor?

    Werden dann eigentlich beide "constructoren" ausgeführt ? Muss deswegen der Constructor des myImage dem TImage identisch sein ( von den Argumenten und den Copilerderektiven) damit der Compiler der "Meinung" ist, das sich somit TImage "richtig" konstruieren lässt ?

    Was mich schon immer Interessiert hat ist dieses Classes:: .
    So greif man doch normal weise auf statische Element zu, wieso in diesem Falle ?

    Entschuldigt die vielen Frage, habe nur vor das ganze mal grundlender zu verstehen.

    Vielen Dank im Voraus



  • Hallo

    Folgendes, der Unterschied zu meinem Letzen Beitrag ist, das du den Contructor des TImage nicht im Header ansprichst. Wieso ?

    Weil es sauberer ist, in der Headerdatei nur die Deklaration und in der CPP-Datei die darauf bauende Implementation zu haben. Also keine Befehle in den Header-Dateien.

    Du deklarierst den myImage Contructor virtuel, damit er vom Timage contructor overloaded wird/werden kann ?

    Ist nur eine Übernahme des virtual-Modis der Basiklasse TObjekt. Im Grunde bei myImage nicht notwendig, nur der Gleichmäßigkeit wegen.

    Was mich schon immer Interessiert hat ist dieses Classes:: .
    So greif man doch normal weise auf statische Element zu, wieso in diesem Falle.

    Classes:: ist in diesem Fall der NameSPace, in dem TComponent deklariert wird. Auch das ist nicht zwingend notwendig, hilft aber in manchen Situationen Konflike mi gleichnamigen Klassen zu verhindern.

    bis bald
    akari



  • Das es sauberer ist, in der Header Datei nur zu Deklarieren und nicht zu Implementieren, war mir klar, hat nur auf meine Weise zum Error geführt 🙂

    Verdammt, hab vergessen das man auf einen Namespace, den man nicht durch namespace definiert hat direkt durch NAMESPACE:: zugreifen kann. Vielen Dank, hatte da schon mal ein Problem mit "string", wo das die Lösung war.

    Super, nun ist nur eine Frage offen :

    Wie werden nun die Construcotren von myImage / TImage aufgerufen ? Sind sie äquivalent ? Reihenfolge ? Overloading ? *imdunkelntappe* 🙂

    Wirklich großen Dank akari.



  • Hallo

    die Konstruktoren (wenn der erste virtual ist) werden der Reihe nach ausgeführt, mit dem untersten, dem der Basisklasse TObject, als erstes, bis oben nach myImage(). Diese Sachen zum Thema Ausführungsreihenfolge von Konstruktoren findest du auch in allen guten Tutorials zum Thema Objektorientierung.

    bis bald
    akari



  • Danke dir, denke solangsam bin ich dabei 🙂


Anmelden zum Antworten