Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Templates

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
09.01.2005, 16:04 Uhr
~RichieRich
Gast


Hallo !

ich bin nicht grad ein großartiger Programmiere und will auch keiner werden

Ich sollte aber bis in einigen Tagen ein Beispiel in C++ über Templates lösen und wollte mal fragen ob mit irgendwer sagen kann worums da geht und was das eigentlich ist ?

Folgende Angabe wurde mir zur Verfügung gestellt:

Schreiben Sie eine C++-Template-Klasse newVector, die einen dynamischen Vektor mit parametrisierbaren Datentyp implementiert und eine herkömmliche Vektoraddition zweier Vektoren mit gleicher Dimension erm¨oglicht. Sollten die Dimensionen der Vektoren bei der Addition nicht übereinstimmen, dann soll die Additionsfunktion eine entsprechende const char* Execption werfen. Ihre Klasse sollte nahtlos in das folgende Testprogramm passen:


Code:
int main() {
newVector<int> a(3), b(3), d;
for (int i=0; i<3; i++) a[i] = b[i] = i;
d = a + b;
for (int i=0; i<3; i++) cout <<" "<<d[i];
cout <<endl; }


Vielleicht erbarmt sich ja einer am Tag des Herrn und gibt mir ein paar Tipps :live:

lG
Richard
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.01.2005, 16:31 Uhr
(un)wissender
Niveauwart



C++:
template <typename T>
class newVector
{
//Dein Ansatz hier
};



--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.01.2005, 16:59 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


endlich mal ne aufgabe die länger als 5 minuten dauert...
auf die schnelle so ist allerdings noch ne menge verbeserungsbedarf und die exeption überlass ich mal dir... funzt aber zunächst...

C++:
#include <iostream>

template <class Typ>
class newVector{

    public:
        newVector();
        ~newVector();
        newVector(size_t n);
        newVector(newVector& v);
        Typ& operator[](int& index);
        void operator=(newVector& v);
        newVector operator+(newVector& v);

        friend std::ostream& operator<<(std::ostream&,newVector<Typ>&);

    private:
        Typ* v;
        size_t n;

};


template <class Typ>newVector<Typ>::newVector(){v=NULL;n=0;}

template <class Typ>newVector<Typ>::newVector(size_t n){this->n=n;this->v=new Typ[n];while(--n+1)this->v[n]=0;}

template <class Typ>newVector<Typ>::~newVector(){if(v)delete [] v;}

template <class Typ>newVector<Typ>::newVector(newVector&v){this->n=v.n;this->v=new Typ[n];for(int i=0;i<v.n;++i)this->v[i]=v[i];}

template <class Typ>Typ& newVector<Typ>::operator[](int& index){return this->v[index];}

template <class Typ> void newVector<Typ>::operator=(newVector<Typ>& v){if(this->n)delete[]this->v;this->n=v.n;this->v=new Typ[v.n];for(int i=0;i<v.n;++i)this->v[i]=v.v[i];}

template <class Typ> newVector<Typ> newVector<Typ>::operator+(newVector<Typ>& v){newVector rv(*this);for(int i=0;i<rv.n;++i)rv.v[i]+=v.v[i];return rv;}

template <class Typ>std::ostream& operator<<(std::ostream& os, newVector<Typ>& v){for(int i=0;i<v.n;++i)os<<v[i]<<" ";os<<std::endl;return os;}

int main() {

    int i;
    newVector<int> a(3), b(3), d;
    for(i=0; i<3; i++)
        a[i] = b[i] = i;
    d = a + b;
    std::cout<<d;
}



--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.01.2005, 17:15 Uhr
~RichieRich
Gast


also DAS war ja mal eine mehr als nur umfassende Antwort

Ganz ganz herzlichen Dank dafür !!

Das mit der Exception bekomm ich schon hin, aber ich hätte nie gedacht dass diese Aufgabe soviel Arbeit sein könnte

Falls du noch mehr Aufgaben suchst die länger als 5 Minuten dauern kann ich dir gerne aushelfen

lG
Richard
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.01.2005, 17:24 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Falls du noch mehr Aufgaben suchst die länger als 5 Minuten dauern kann ich dir gerne aushelfen


hmm hab leider gerade selber eine und ne abwechslung gesucht bei der ich mir das hirn nicht übelst zermatern muss aber auch nicht so trivial ist das ichs ohne compiler hinschreiben kann... da war diese aufgabe gerade richtig...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.01.2005, 17:48 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@(un)wissender...
eigentlich müsste doch auch sowas möglich sein oder...

C++:
template <class Typ>class newVector:public std::vector<Typ>{
};


der scheiss dabei ist nur das man die konstruktoren neu schrieben muss und mich mit denen von der stl rumzuärgern ist mir eventuell zu hoch
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.01.2005, 23:09 Uhr
(un)wissender
Niveauwart


Nein, das ist nicht möglich.
std::vector hat keinen virtuellen Destruktor, außerdem ist es per Defintion verboten von stl-Klassen abzuleiten.

Deine Vectorklasse ist übrigens nicht korrekt.
Sie erzeugt bei dem Kopieren eines konstanten Vectors (vermutlich) eine bitweise Kopie oder der Aufruf misslingt (was noch zu vertreten wäre, dann funzt das Programm zumindest nicht falsch), was wohl nicht die Intension sein sollte.
Außerdem ist da snicht zu kompilieren, operator>> muss deklariert werden.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.01.2005, 23:21 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also bei mir kompiliert das und die feinheiten interessieren mich nicht... er wollte ja nur einen ansatz
du wolltest ja nicht
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.01.2005, 23:36 Uhr
(un)wissender
Niveauwart


@Windalf
Das hier ist eine korrekte Version (hoffe ich zumindest, nicht alles getestet). Deine war falsch (ehrlich, bei const Vector wird falscher Code ausgeführt), nicht Ansi-C++, nicht exceptionsicher, usw. Sorry, aber dein Vector ist totaler Mist. Ist vielleicht nicht nett formuliert, aber er sollte ja hier als Lehrstück dienen und du kannst es eigentlic besser.
Sei mir nicht böse.


C++:
#include <functional>
#include <algorithm>
#include <iostream>
#include <cstddef> //für std::size_t


template <class Typ>
class newVector;

template <class Typ>
std::ostream& operator<<(std::ostream&,const newVector<Typ>&);

template <class Typ>
class newVector{

    public:
        newVector();
        ~newVector();
        newVector(std::size_t n);
        newVector(const newVector& v);
        Typ& operator[](int index);
        const Typ& operator[](int index) const;
        newVector& operator=(const newVector& v);
        const newVector operator+(const newVector& v) const;

        friend std::ostream& operator<< <>(std::ostream&,const newVector<Typ>&);

    private:
        void assign(const newVector<Typ>&);
        
        Typ* v;
        size_t n;

};

template <class Typ>
void newVector<Typ>::assign(const newVector<Typ>& vec)
{
    Typ* temp = new Typ[vec.n];
    std::copy(vec.v, vec.v + vec.n, temp);
    std::swap(temp, v);
    delete [] temp;
    n = vec.n;
}
    
template <class Typ>
newVector<Typ>::newVector()
{
    v = 0;
    n = 0;
}

template <class Typ>
newVector<Typ>::newVector(std::size_t n)
{
    this->n=n;
    this->v=new Typ[n];
    std::fill(v, v + n, 0);
}

template <class Typ>
newVector<Typ>::~newVector()
{  
    delete [] v;
}


template <class Typ>
newVector<Typ>::newVector( const newVector& v)
{
    assign(v);
}

template <class Typ> Typ&
newVector<Typ>::operator[](int index)
{
    return this->v[index];
}

template <class Typ>
const Typ& newVector<Typ>::operator[](int index) const
{
    return this->v[index];
}

//war nicht exceptionsicher!
template <class Typ>
newVector<Typ>& newVector<Typ>::operator=(const newVector<Typ>& v)
{
     assign(v);
}

template <class Typ>
const newVector<Typ> newVector<Typ>::operator+(const newVector<Typ>& v) const
{  
    //Hier Exception, wenn n != v.n
    newVector rv(*this);
    std::transform(rv.v, rv.v + rv.n, v.v, rv.v, std::plus<Typ>());
    return rv;
}

template <class Typ>std::ostream& operator<<(std::ostream& os, const newVector<Typ>& v)
{
    for(int i=0;i<v.n;++i)os<<v[i]<<" ";os<<std::endl;return os;
}

int main() {

    int i;
    newVector<int> a(3), b(3), d;
    for(i=0; i<3; i++)
        a[i] = b[i] = i;
    d = a + b;
    std::cout << d;
}


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 09.01.2005 um 23:37 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
09.01.2005, 23:46 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@(un)wissender...
ich weiss das ich von der stl höchstens halb soviel ahnung hab wie du... da werd ich das bestimmt nicht mit dir diskutieren...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: