Templates (Sehen ,verstehen^^)



  • Wenn alles gut läuft, in der kommenden Version, neben dem Class Explorer für C++.



  • #inlcude "dat.impl"//Wichtige Stelle!!
    

    muss die datei ".impl" heißen oder kann die auch anders heißen?



  • Wikinger75 schrieb:

    #inlcude "dat.impl"//Wichtige Stelle!!
    

    muss die datei ".impl" heißen oder kann die auch anders heißen?

    freier name.
    aber bei .impl weiß sogar ich, was damit gemeint ist. die implementierung von templatefunktionen, gell?



  • gut danke leute^^



  • asc schrieb:

    Ganz ehrlich: Es gibt auch sinnvolle Regeln, und diese gehört dazu.

    sinnvoll? nein, nicht mit fettem "niemals" drin.
    sobalds kein dogma mehr ist, geb ich dir recht.

    ich verwende entweder std oder vlib, aber ich will eigentlich nicht innerhalb eines projekts beide benutzen. da kann ich mir doch ein using namespace std oder using namespace vlib in den zentralen header knallen und dort umschalten.



  • ehm folegndes^^
    habs jetzt so:
    hpp

    // dat.hpp
    #ifndef DAT_HPP_
    #define DAT_HPP_
    
    template <class data>
    class DAT
    {
    private:
       data Var;
    public:
       data getData();
       bool isEmpty();
       void setData(data Wert);
    };
    
    #include "dat.impl"
    
    #endif
    

    impl

    // dat.impl
    
    //----------> Getter! <----------//
    data DAT::getData()
    {
         return Var; 
    }
    
    //----------> Prüfer! <----------//
    bool DAT::isEmpty()
    {
         if (Var == 0) {return true;}
         else {return false;}
    }
    
    //----------> Setter! <----------//
    void DAT::setData(data Wert)
    {
         Var = Wert;
    }
    
    //----------> TheEnd! <----------//
    

    Es gibt immer noch einen compiler fehler, auch wenn ich seh in h umbenene, naja werds wohl gleich in der hpp machen müssen^^



  • getData ist aber nicht in der klasse DAT, sondern in DAT<data>.
    das ging glaub ich so:

    template <class data> 
    data DAT<data>::getData()
    {
         return Var; 
    }
    

    aber bis auf seltene ausnahmen würde ich mich damit nicht behängen und den code einfach in die klasse kloppen.



  • ich habs jetzt aber in eine header gemacht so wie ich es vorhin geschrieben habe und es ging ohne das <data>.



  • Wikinger75 schrieb:

    muss die datei ".impl" heißen oder kann die auch anders heißen?

    Kann auch anders heissen. Neben .hpp und .h sieht man oft auch .inl, .ipp oder .impl. Ich bevorzuge persönlich .inl (für Inline), da hat MSVC gerade einen eigenen Datentyp.

    volkard schrieb:

    aber bis auf seltene ausnahmen würde ich mich damit nicht behängen und den code einfach in die klasse kloppen.

    Naja, ist auch ein wenig Geschmackssache. Ich mach oft eine Trennung, damit ich Schnittstelle und Implementierung sauber separiert habe. Auch wenn das manchmal auf komplizierte Funktionsdefinitionen herausläuft, gerade wenn noch ein typedef dabei ist... 😉

    P.S. Getter sollte man const machen, da man nichts an der Klasse verändert und somit die Memberfunktion auch mit konstanten Instanzen aufrufen kann.



  • // DAT.hpp
    #ifndef DAT_HPP_
    #define DAT_HPP_
    
    template <class DATA>
    class DAT
    {
    private:
       DATA Var;
    public:
       DATA getData() const;
       bool isEmpty();
       void setData(data Wert);
    };
    
    //----------> Getter! <----------//
    DATA DAT<DATA>::getData() const
    {
         return Var; 
    }
    
    //----------> Prüfer! <----------//
    bool DAT<DATA>::isEmpty()
    {
         if (Var == 0) {return true;}
         else {return false;}
    }
    
    //----------> Setter! <----------//
    void DAT<DATA>::setData(data Wert)
    {
         Var = Wert;
    }
    
    //----------> TheEnd! <----------//
    
    #endif
    

    Es ist in einer Datei und es funktioniert nicht.



  • Wikinger75 schrieb:

    Es ist in einer Datei und es funktioniert nicht.

    Das ist keine Fehlerbeschreibung!



  • Wikinger75 schrieb:

    // DAT.hpp
    #ifndef DAT_HPP_
    #define DAT_HPP_
    
    template <class DATA>
    class DAT
    {
    private:
       DATA Var;
    public:
       DATA getData() const;
       bool isEmpty();
       void setData(data Wert);
    };
    
    //----------> Getter! <----------//
    DATA DAT<DATA>::getData() const
    {
         return Var; 
    }
    
    //----------> Prüfer! <----------//
    bool DAT<DATA>::isEmpty()
    {
         if (Var == 0) {return true;}
         else {return false;}
    }
    
    //----------> Setter! <----------//
    void DAT<DATA>::setData(data Wert)
    {
         Var = Wert;
    }
    
    //----------> TheEnd! <----------//
    
    #endif
    

    Es ist in einer Datei und es funktioniert nicht.

    // DAT.hpp
    #ifndef DAT_HPP_
    #define DAT_HPP_
    
    template <class DATA>
    class DAT
    {
    private:
       DATA Var;
    public:
       DATA getData() const;
       bool isEmpty();
       void setData(data Wert);
    };
    
    //----------> Getter! <----------//
    template <class DATA>
    DATA DAT<DATA>::getData() const
    {
         return Var; 
    }
    
    //----------> Prüfer! <----------//
    template <class DATA>
    bool DAT<DATA>::isEmpty()
    {
         if (Var == 0) {return true;}
         else {return false;}
    }
    
    //----------> Setter! <----------//
    template <class DATA>
    void DAT<DATA>::setData(data Wert)
    {
         Var = Wert;
    }
    
    //----------> TheEnd! <----------//
    
    #endif
    

    Dir fehlt der Template"bezeichner" (ich nenns einfach mal so:D)



  • Lol, ich wusste nicht das man auch auserhalb der klasse das template einfügen muss^^. Jetzt funktionierts entgültig.
    Thx.



  • Wikinger75 schrieb:

    Lol, ich wusste nicht das man auch auserhalb der klasse das template einfügen muss^^. Jetzt funktionierts entgültig.
    Thx.

    Ja, klar. Der Compiler kann da sonst nicht wissen, was DATA sein soll. Darum musst du es ihm explizit sagen, dass es ein Templateparameter ist. Das entfällt, wenn du die Definition innerhalb der Klasse machst, da du den Parameter bereits spezifiziert hast.


Anmelden zum Antworten