Problem mit TObject als Vorfahrtyp



  • Hallo,
    vielen Dank schonmal für deine schnelle Antwort, akari. Trotzdem läuft es noch nicht richtig. Ich habe also alles so gemacht wie akari gesagt hat:

    //---------------------------------------------------------------------------
    class PACKAGE TWord : public TObject
    {
    private:
    protected:
    public:
            __fastcall TWord();
    __published:
    };
    //---------------------------------------------------------------------------
    
    ....
    
    __fastcall TWord::TWord()
            : TObject()
    {
    }
    

    Nun kommt aber folgende Fehlermeldung, mit der ich auch nicht klar komme:

    [C++ Fehler] Word.cpp(16): E2285 Keine Übereinstimmung für 'TWord::TWord(int)' gefunden

    Außerdem ist mir nicht klar, warum alles z.B bei TImage als Vorfahrtyp funktioniert. Da stehen auch diese Parameter 😕

    Vielen Dank für eure Hilfe
    lg, freakC++



  • Hallo

    freakC++ schrieb:

    Nun kommt aber folgende Fehlermeldung, mit der ich auch nicht klar komme:

    [C++ Fehler] Word.cpp(16): E2285 Keine Übereinstimmung für 'TWord::TWord(int)' gefunden

    Du versuchst irgendwo ausserhalb der hier gezeigten Codeauschnitte den Konstruktor von TWord mit einem Integer als Argument aufzurufen. Aber du hast keinen solchen Konstruktor.

    Außerdem ist mir nicht klar, warum alles z.B bei TImage als Vorfahrtyp funktioniert. Da stehen auch diese Parameter

    Die Ableitung von TImage muß genau dasselbe Problem bringen wie bei TForm.
    Und im übrigen überlegt man sich vorher wovon man ableiten will, und probiert dann nicht einfach aus um herauszufinden was ohne Fehler kompiliert...

    bis bald
    akari



  • Hey,
    ich probiere nicht herum, um herauszufinden, ob es Fehler gibt. Ich habe nur festgestellt,dass bei den Klassen, die von TIMage abgeleitet sind nicht diese Probleme entstehen. Außerdem macht alles ja C++ Builder.

    Wie schon gesagt. Ich lege eine leere Unit (also ein ganz neues Projekt) an und erstelle automatisch mit dem Builder die Klasse. Ich gebe also gar keinen Quelltext ein, sondern das übernimmter der Builder. Wenn die Klasse halt TObject als Vorfahrtyp hat, dann kommen die eben genannten Fehler, mit denen ich nicht klar komme!

    Vielen Dank für eure Hilfe
    lg, freakC++



  • Wenn du eine neue Komponente erzeugen willst, so sollte mindestens von TComponent, besser aber noch von TControl bzw. TWinControl oder konkreten Komponenten abgeleitet werden. TObject ist der Basis-Typ der VCL, von dem man möglichst nicht direkt erben sollte.

    Wenn du nur eine normale (Logik-) Klasse erzeugen willst, so brauchst du gar keine Basisklasse (insbesondere keine VCL-Klasse!) anzugeben.



  • Hallo

    Und vermutlich ist Komponente->Neue Komponente auch nicht dazu gedacht Klassen zu erstellen die nicht von TComponent abgeleitet sind, d.h. also damit erstellst du nur Komponenten die direkt im Objektinspektor verwendet werden.

    Klassen ohne Basisklasse oder Ableitung von TObjekt "must" du immer manuell erstellen.

    bis bald
    akari



  • Hi,
    es ist halt so, dass ich solch ein ähnliches Kapitel in meinem Lehrbuch habe. Dort steht geschrieben, dass jede neue Klasse normalerweise von TObject ist und, wenn man nicht irgendwelche Extrawünsche hat, sollte man seine eigene Klasse immer von dieser Klasse ableiteten.

    Es kann natürlich sein, dass Komponente->Komponente erstellen nicht dazu gedacht ist von TOBject abzuleiten.

    Ich versuche also nochmal die Klasse "manuell" zu erstellen.

    Ich danke euch für eure Antworten
    lg, freakC++



  • So ich hab jetzt, die Klasse nochmal manuell erstellt. Leider kommen die ganz oben genannten beiden Fehler. Akari hat zwar einen Lösungsvorschlag, doch leider kenne ich nicht das Wort Implementation?

    Was meinst du damit??

    Vielen Dank für euer Verständnis
    lg, freakC++



  • Hi,

    Implementation ist das Ergebnis einer Implementierung. Implementierung bedeutet vereinfacht: "Du baust etwas ein" / "übernimmst etwas" in Dein Projekt.

    MfG



  • Hallo

    Um es speziel für diesen Fall zu erklären : Implementation ist das Gegenteil von Interface.

    // Interface der Klasse
    class TWord
    {
      TWord();
    };
    
    // Implementation der Klasse bzw. deren Methoden
    TWord::TWord()
    {
    }
    

    In C++ werden Interface und Implementation normalerweise getrennt, in .h und .cpp Dateien.

    Damit habe ich noch eine korrekte Variante gepostet. Wenn die bei dir nicht funktionieren machst du irgendwas falsch, ist aber von hier aus nicht zu erkennen.

    bis bald
    akari



  • Warum leitest du überhaupt von TObject ab? Ohne vernünftigen Grund würde ich das nicht tun, denn damit handelst du dir einige unagenehme Eigenschaften ein.

    Gruß,
    Doc



  • Ich leite von TObject ab, da ich ich da Thema gerade mit meinem Lehrbuch durchkaue und ein paar Beispiele selber machen möchte. Ich poste auch noch mal mehr Quelltext, falls ich es nicht hinbekommen sollte.

    Vielen Dank für eure Erklärungen
    lg, freakC++



  • So, mit der manuellen Vereinbarung hab ich es geschafft. Vielen Dank für eure Hilfe!!!

    lg, freakC++


Anmelden zum Antworten