Vererbung von Vector<T> an NumericVector<T> Probleme mit operator* u.ä.



  • Dann warte mal ab, bis du mit dem Zeitreihen-Vektor anfängst - mit dem Konvertierungs-Konstruktor kann es dir nämlich ganz schnell passieren, daß du verschiedene Vektortypen bunt durcheinander verrechnest.


  • Mod

    ein hinweis auf http://www.boost.org/libs/utility/operators.htm ist hier angebracht.

    eine möglichkeit, ein duplikat der vector-implementation zu vermeiden, besteht darin, diese als vector basisklasse nach dem typ des vectors zu parametrisieren:

    template<typename T, template<typename> class U>
    class VectorBase
    {
    private:
        T* vectorPtr;
        COUNTER dim;
    protected:
        VectorBase(COUNTER n, const T& initVal);
        ~VectorBase(){delete [] vectorPtr;}
    
        VectorBase(const VectorBase&);
        VectorBase& operator=(const VectorBase&);
    public:
        U<T>& operator+=(const VectorBase&); // hier wird dann ein return static_cast< U<T>& >( *this )  benötigt
        U<T>& operator-=(const VectorBase&);
    
     // usw
    
    };
    template<typename T, template<typename> class U>
    U<T> operator+(U<T> lhs, const U<T>& rhs)
    {
        return lhs += rhs;
    }
    // usw
    
    template<typename T>
    class Vector : public VectorBase< T, Vector >
    {
    // ...
    };
    
    template<typename T>
    class NumericVector : public VectorBase< T, NumericVector >
    {
    // ...
    };
    

    Vector und NumericVector sind jetzt zwei template klassen, die nichts miteinander zu tun haben, die gemeinsame representation der daten ist dennoch nur einmal implementiert. das ist auch keine perfekte lösung...


Anmelden zum Antworten