Maximilian Krieg
Wissen, Technik & Erfahrungen
Wissen, Technik & Erfahrungen
Wissen, Technik & Erfahrungen

Start: Seite 23
//Abfangen des Falles, dass man von dem gleichen Vektor in sich selbst kopieren/verweisen will
if (this==&a) return *this;
Der new-Operator kann nur initialisierten Speicher zur Verfügung stellen. Deshalb muss er wissen, für welchen Typ der Speicher reserviert werden soll. Da mann für Templates allerdings uninitialisierten Speicher reservieren muss, werden extra „allocate“-Typen erstellt, die mit „rohem“ Speicher umgehen können.
template class Name_value { // Template swap für alle Klassen
private:
string name;
Name_value( string name, X value );
Name_value& operator=( const Name_value& a );
X val;
public:
// …
};
// Aufrufe
Name_value nvi( string("Zwerge"), 7 );
Name_value nvb( string("Checked"), true );
Name_value nvc( string("Tabulator"), '\t' );
};
template void swap( X& a, X& b ) {
X tmp = a; a = b; b = tmp;
}
//Aufruf
int v(123); int w(-7); swap( v, w );
// Fehler, Standardkonstruktor für den selbst definierten Typen <em>"No_default"</em> fehlt
// wenn ein Default-Wert mitgegeben wird, dann ist es kein Problem
myVector v2( 10 );
// besser : myVector v2(10,1.0)
/*
* File: main.cpp
* Author: maximilian.krieg
*
* Created on 26. April 2012, 09:02
*/
/* template.cpp
osk-2011-dez
PAD2, ein einfaches vector Template selbst gemacht
*/
#include
#include "error.h"
using namespace std;
using std::runtime_error;
template class myVector {
int sz;
int space;
T* elem;
public:
myVector() : sz(0), space(0), elem(0) {
}
explicit myVector(int, T);
myVector(const myVector&);
myVector& operator=(const myVector&);
~myVector();
int size() const;
int capacity() const;
T& operator[](int);
void reserve(int);
void resize(int, T);
void push_back(const T&);
};
template myVector::myVector(int s, T val = T()) {
}
template myVector::myVector(const myVector& a) {
}
template myVector& myVector::operator=(const myVector& a) {
}
template myVector::~myVector() {
}
template void myVector::reserve(int newspace) {
if (newspace T* p = new T[newspace]; // mit new Speicher allokieren
for (int i = 0; i < sz; ++i) p[i] = elem[i]; // Elemente kopieren
delete[] elem; // alten Speicher freigeben
elem = p;
space = newspace;
}
template void myVector::resize(int newsize, T val = T()) {
reserve(newsize);
for (int i = sz; i < newsize; ++i) elem[i] = val;
sz = newsize;
}
template void myVector::push_back(const T& val) {
if (space == 0) reserve(8);
else if (sz == space)
reserve(space * 2);
elem[sz] = val;
++sz;
}
template T& myVector::operator[](int n) {
if (0 > n || sz
return elem[n];
}
/*
*
*/
int main() {
myVector v1;
v1.push_back(1);
cout << v1[0];
return 0;
}
Ende: Seite 43