template Klasse korrekt ableiten


  • Administrator

    Grüsse zusammen,

    Ich habe ein paar Fragen zum korrekten ableiten einer template Klasse, wenn das überhaupt geht.

    // Die Beispielbasisklasse:
    template<class TYPE, class ARG_TYPE>
    class CBaseTemplateClass
    {
        // bla bla bla
    }
    

    Wie erreiche ich nun eine abgeleitete Klasse CDerviedTemplateClass, ...

    1. ... wo die templates der Basisklasse bereits definiert sind?
    2. ... wo man die templates TYPE und ARG_TYPE immer noch definieren muss?

    Zusatzfragen zu:
    1. Kann ich dann in der abgeleiteten Klasse TYPE auch benutzen, bzw. ARG_TYPE?
    2. Wie teilt man der Basisklasse mit, welche templates definiert wurden?

    Danke für die Hilfe.

    Grüssli


  • Mod

    Dravere schrieb:

    Grüsse zusammen,

    Ich habe ein paar Fragen zum korrekten ableiten einer template Klasse, wenn das überhaupt geht.

    // Die Beispielbasisklasse:
    template<class TYPE, class ARG_TYPE>
    class CBaseTemplateClass
    {
        // bla bla bla
    }
    

    Wie erreiche ich nun eine abgeleitete Klasse CDerviedTemplateClass, ...

    1. ... wo die templates der Basisklasse bereits definiert sind?
    2. ... wo man die templates TYPE und ARG_TYPE immer noch definieren muss?

    Zusatzfragen zu:
    1. Kann ich dann in der abgeleiteten Klasse TYPE auch benutzen, bzw. ARG_TYPE?
    2. Wie teilt man der Basisklasse mit, welche templates definiert wurden?

    Danke für die Hilfe.

    Grüssli

    huh?

    // Die Beispielbasisklasse:
    template<class TYPE, class ARG_TYPE>
    class CBaseTemplateClass
    {
        // bla bla bla
    }
    

    Das ist ein Klassentemplate. Eine konkrete instanz davon ist eine klasse (oder expliziter eine templateklasse). die teile in spitzen klammern heißen parameter und sind in diesem falle keine templates sondern typen. die konkreten "werte" für diese parameter nennt man argumente. bittte formuliere deine fragen noch einmal diese begriffsbestimmungen nutzend.



    class Derived : public Base<int, double>
    {
    
    };
    
    template <class TYPE, class ARG_TYPE> // kann anders oder gleich heißen, egal
    class Derived : public Base<TYPE, ARG_TYPE>
    {
        // hier kannst du die params benützen, ja
    };
    

    Die Antworten auf die Zusatzfragen ergeben sich dann.

    BTW: C vorm Klassennamen ist nicht mehr "in".

    MfG SideWinder


  • Administrator

    @camper,
    Es war spät, ich war vom Tag verdammt müde und mir sind die Begriffe nicht mehr korrekt eingefallen. Hatte gehofft, dass jemand sich selber ein paar Gedanken dazu machen kann um mir die richtige Lösung zu sagen, ansonsten hätte ich heute halt alles noch editiert. Bin erst neu bei den templates (praktische Dinger) und kenne die Begriffe daher noch nicht auswendig genau ^^

    @SideWinder,
    Danke das du dir Gedanken gemacht hast *g*

    Eine Frage habe ich allerdings noch (und nun korrekt formuliert hoff ich ^^):

    class CDerived : public CBase<int, double>
    {
        // Kann ich hier TYPE, bzw. ARG_TYPE von CBase verwenden? Ich denke mal nicht,
        // trotzdem möchte ich nochmals gefragt haben. Und ja es ist eigentlich 
        // unsinnig hier TYPE und ARG_TYPE von CBase verwenden zu wollen ^^
    };
    

    SideWinder schrieb:

    BTW: C vorm Klassennamen ist nicht mehr "in".

    Ich gehe nie nach Moden. Ich bin so ein dummer Fisch der gegen den Strom schwimmt 😉
    Mir gefällt das C vor den Klassennamen. Auch sonst gefallen mir die Präfixe. Ich find sowas praktisch und gut. Und solange ICH dies gut finde, verwende ich es. Wenn es jemand anderes nicht will, von mir aus.

    Grüssli



  • class CDerived : public CBase<int, double>
    {
        typedef int TYPE;
        typedef double ARG_TYPE;
        ...
    };
    

  • Administrator

    Michael E. schrieb:

    class CDerived : public CBase<int, double>
    {
        typedef int TYPE;
        typedef double ARG_TYPE;
        ...
    };
    

    LOL 😃
    Dir ist aber hoffentlich schon klar, dass dies nicht meine Frage beantwortet oder? Ich habe gesagt das TYPE und das ARG_TYPE aus CBase. Ich weiss ja das die Frage nicht viel Sinn macht, trotzdem möchte ich es wissen. Ich habe es schon selber ein wenig probiert und meiner Meinung nach logischerweise, da es wohl nicht geht, nicht geschafft. Ich möchte einfach noch ein Wort von jemanden hören, der es ganz sicher weiss, dass es wirklich keine Möglichkeit gibt ^^

    Also Vererbung von Typen (oder heissen die jetzt Parameter?) ist nicht möglich?

    Grüssli



  • Dravere schrieb:

    Michael E. schrieb:

    class CDerived : public CBase<int, double>
    {
        typedef int TYPE;
        typedef double ARG_TYPE;
        ...
    };
    

    LOL 😃
    Dir ist aber hoffentlich schon klar, dass dies nicht meine Frage beantwortet oder? Ich habe gesagt das TYPE und das ARG_TYPE aus CBase.

    Wo ist dein Problem? TYPE und ARG_TYPE in CBase sind int und double. Also ist das schon ne Lösung.

    mfg.



  • Dravere schrieb:

    Also Vererbung von Typen (oder heissen die jetzt Parameter?) ist nicht möglich?

    So wie Du es (hoffentlich?) meinst nur so:

    template<class A, class B>
    class Basis
    {
    protected:
        typedef A TYPE;
        typedef B ARG_TYPE;
    };
    
    class Derived: public Basis<int, double>
    {
        // TYPE und ARG_TYPE benutzen...
    };
    

  • Administrator

    @joomoo,
    Aber in dem Beispiel wurde nichts vererbt, sondern nur neu definiert. Natürlich kommt es auf das gleiche raus, aber dann könnte man ja gleich int und double nehmen. Man könnte sowieso in allen Fällen gleich int und double nehmen, is klar, aber ich wollte wissen ob was vererbt wird oder nicht.

    @LordJaxom
    Ok, also ist die Antwort: Ja, es wird nichts vererbt?

    Wieso könnt ihr nicht einfach ein Ja oder ein Nein hinschreiben, ich will ja gar nichts mehr 😃

    Aber weil LordJaxom "nur so" geschrieben hat, denke ich nun einfach, dass es ein JA war. Danke ^^

    Grüssli



  • Das muss daran liegen dass es nichts zu vererben gibt 😃

    Das Template ist keine Klasse, sondern ein Template. Die Klasse ist erst die Instanziierung, egal ob beim Ableiten oder beim Erstellen eines Objektes. Bei der Klasse gibt es also TYPE und ARG_TYPE garnicht mehr. Die gibt es nur im Template, und von einem Template kann man nicht erben 😉


  • Administrator

    LordJaxom schrieb:

    Das muss daran liegen dass es nichts zu vererben gibt 😃

    Das Template ist keine Klasse, sondern ein Template. Die Klasse ist erst die Instanziierung, egal ob beim Ableiten oder beim Erstellen eines Objektes. Bei der Klasse gibt es also TYPE und ARG_TYPE garnicht mehr. Die gibt es nur im Template, und von einem Template kann man nicht erben 😉

    Aber wenn es nichts zu vererben gibt, dann ist es ein NEIN ^^
    Danke für die Erläuterung wieso es NEIN ist. *g*

    Endlich kann man den Thread als beendet erklären XD

    return 0;

    Grüssli


Anmelden zum Antworten