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 ]
010
10.01.2005, 06:36 Uhr
virtual
Sexiest Bit alive
(Operator)



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

Vorsicht: der erste Teilsatz stimmt, der zweite hingegen nicht. Zum Beispiel wäre ohne ererbung das ganze Streamkonzept nicht denkbar.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
10.01.2005, 06:43 Uhr
virtual
Sexiest Bit alive
(Operator)


@(un)wissender


Zitat von (un)wissender:
@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.


Aber dann solltest Du es zumindestens einen Vecotr schreiben, der nicht bei jedem Kopieren
abstürzen wird :


C++:
template <class Typ>
newVector<Typ>::newVector( const newVector& v)
{
    assign(v);  // Autsch! Kopieren!=Zuweisen, du greifst jetzt in assign auf uninitialisierten Speicher zu
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
10.01.2005, 08:17 Uhr
(un)wissender
Niveauwart


Hm, dann waren es wohl nur die Container. Obwohl viele auch behaupteten, dass die io-Sachen nicht zur STL gehören.

// Autsch! Kopieren!=Zuweisen, du greifst jetzt in assign auf uninitialisierten Speicher zu

Tue ich nicht wirklich, der assign-Code ist korrekt.

Das Problem ist: Ich lösche einen Pointer, der nicht null ist und nicht initialisiert.

C++:
template <class Typ>
newVector<Typ>::newVector( const newVector& v)
{
     this->v = 0; //Die Zeile hatte ich vergessen.
    assign(v);
}


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
10.01.2005, 08:21 Uhr
(un)wissender
Niveauwart


@windalf
Na ja, kannst es ja als Verbesserung deiner Programmierkünste ansehen, die ja schon nicht shclecht sind. Ich bekomme auch regelmäßig eines aufs Dach (siehe oben), aber das ist nicht schlimm, sondern ermahnt einen, sorgfältiger zu arbeiten.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
10.01.2005, 15:13 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


@(un)wisender...
hmm deine bemerkung mit dem das muss deklariert sein hab ich bis jetzt noch nicht verstanden... schreibt das der standard so vor oder was bringt mir das sonst...

und was ist hiermit

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


warum nochmal spitze klammer auf und zu... was genau bringt das bzw was hat das für ne bedeutung...

ich geb immer einfach was ein so lange bis der compiler das frisst und dann das rauskommt was ich wollte und bin dann zufrieden
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 10.01.2005 um 15:13 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
10.01.2005, 15:20 Uhr
(un)wissender
Niveauwart


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

Das hier ist template-Spezialisierung für alle Typen, weiterhin ist das keine Deklaration, sondern nur die Aussage: ich möchte alle Templatefunktionen mit template <typename Typ>std::ostream& operator<<(std::ostream&,const newVector<Typ>&; zum Freund haben.
Also muss es schon den Funktionsprototypen geben, C++ braucht Funktionsprototypen.
Man kann natürlich gleich mit der Deklaration die Definition vornehmen, aber das ist eher schlechter Stil.
Was du gemacht hast war sowas wie: hier das ist dein Freund, aber du hast den Freund vorher nicht vorgestellt. Du hast quasi eine Funktion verwendet, ohne das sie da war.


Bearbeitung:

Wenn du den operator>> schon die der Klasse definiert hättest, dann wäre das auch gegegangen, also Deklaration, Definition, und friend-Deklaration in einem.


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

Dieser Post wurde am 10.01.2005 um 15:25 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
10.01.2005, 15:27 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

Das hier ist template-Spezialisierung für alle Typen, weiterhin ist das keine Deklaration, sondern nur die Aussage: ich möchte alle Templatefunktionen mit template <typename Typ>std::ostream& operator<<(std::ostream&,const newVector<Typ>&; zum Freund haben.
Also muss es schon den Funktionsprototypen geben.


ja soweit wars mir auch schon klar obwohl mein compiler das auch ohne funktionsprotoypen frisst...

was ich wissen wollte ist warum du zischen << und (std::ostream...) ein <> packst...

derklariert hast du ja ohne <> aber mir will der unterschied zwischen


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


nicht einleuchten...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
10.01.2005, 17:50 Uhr
(un)wissender
Niveauwart


Habe ich das nicht gesagt?

Das ist der Funktionsprototyp:

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



Das hier ist eine Spezielisierung für alles, macht hier keinen Sinn, aber mit freind schon, sieht meine vorherige Erklärung.

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



z.B könnten ich auch schreiben, dann wäre es nur für ints


C++:
template <>
std::ostream& operator<< <int>(std::ostream&,const newVector<int>&);



Hier vielleicht nochmal mit int-Spezi zum ansehen, hier wird auch deutlich, dass die Für-alles-friend-Deklaration auch für ints gilt.


C++:
emplate <class Typ>
class newVector;

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

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

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)
{
    this->v = 0;
    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;
}

template <> std::ostream& operator<< <int>(std::ostream& os, const newVector<int>& v)
{
    os << "int\n";
    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;
    newVector<int> c(a);
    std::cout << d;
    std::cout << c;
}


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


@(un)wissender...
ich glaub ich bin zu doof ne frage zu stellen...
also wenn ich bei der frienddeklaration nochmal <> schreibe gilt das für alle typen (das es Buddys sind) und wenn ich die weglasse gilt das doch auch für alle typen oder für was genau gilt es dann... ein total verwirrter windalf
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
10.01.2005, 21:46 Uhr
(un)wissender
Niveauwart


Du schreibst ja nicht nochmal <>, sondern genau da. Wenn du das weglässt, erklärst du eine andere Funktion zum friend, aber nicht die vorher deklarierte. Das Compilerieren wird mit einem richtigen Compiler scheitern. Viielciht schaust du die mal ein Tutorial über template-Spezialisierung an.
Ist ein bisschen strange, aber wenn man es mal kapiert hat ist es logisch.

Vielleicht wird das ganze klarer, wenn du weißt, dass der operator>> nicht zu der Klasse gehört. Die typename Typ ist nicht das gleiche für newVector und die Funktion.
Darum ist es auch so weichtig das vernünftig getrennt aufzuschreiben, damit man das schon im Ansatz sieht. So wie es dein Compiler durchgehen lässt, könnte man denken, das der operator>> zu der Klasse gehören würde, dabei wird diese Funktion ausschließlich zum Freund erklärt.
--
Wer früher stirbt ist länger tot.
 
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: