Robert Bienert: (C++) Index-Operator überladen in Klassentemplate

Beitrag lesen

Moin!

Der (gekürzte) Quelltext sieht wie folgt aus:

template<typename T> class Vector
{
private:
unsigned int length;

  
Nimm am Besten `size_t`{:.language-c++} anstelle von `unsigned int`{:.language-c++}, da size\_t genau so dimensioniert ist, wie deine Plattform maximal an Arbeitsspeicher verwalten kann.  
  

>  ~~~c++

T* daten;  

>   
>  unsigned int getLength(){return this->length;}  
>  T* getDaten(){return this->daten;}  
>  void setDaten(T* daten){this->daten=daten;}  
>   
> public:  
>  Vector(void){

In C++ brauchst diese „C-Schreibweise“ nicht mehr, stattdessen schreibt man:

Vektor() {, wobei der Code für setLength() und setCapacity noch fehlt:

this->setLength(0);

this->setCapacity(100);
  daten = new T[100];
}
~Vector(void){
  delete daten;
}

  
Du legst daten doch als Array an, von daher musst du den Operator `delete`{:.language-c++} in der Arrayschreibweise benutzen:  
  
~~~c++
~Vektor() {  
    delete[] daten;  
}

void push_back(T element);

T& operator[](unsigned int position){return this->getDaten()[position];} //funktioniert nicht
T& out(unsigned int position){return this->getDaten()[position];} //funktioniert
unsigned int size(){return getLength();}
};

  
Beim ersten Kompilieren mit dem GCC fiel mir auf, dass in der Zeile hier drüber die Klassendefinition ja zu Ende ist, der GCC stößt sich daher an folgendem Code:  
  

> ~~~c++

template <typename T> void Vector<typename T>::push_back(T element){  

>  daten=this->getDaten();  
>  daten[this->getLength()]=element;  
>  this->setDaten(daten);  
> }

Wenn ich diese Methode folgendermaßen _in die Klasse_ integriere, gibt es soweit keine Fehler mehr, allerdings verstehe ich nicht, wieso du daten sich selbst zuweist:

void push_back(T element){  
    daten=this->getDaten();  
    daten[this->getLength()]=element;  
    this->setDaten(daten);  
}

Dafür allerdings im Folgenden:

void main(){

Vector<int>* erwin = new Vector<int>;
erwin->push_back(12345);
erwin->push_back(678);
int a = erwin->out(1);
int b = erwin[1];
}

  
 • error: `main' must return `int'  
 • error: cannot convert `Vector<int>' to `int' in initialization, bezogen auf  
   `int b = erwin[1];`{:.language-c++}  
   was auch logisch ist, schließlich ist erwin \_ein Pointer, kein Objekt\_.  
  
Basierend auf deinem eigentlichen Problem gibt es zwei Möglichkeiten:  
  
1\. An erwins Element 1 kommst du mit dem []-Operator wie folgt:  
   `int b = erwin->operator[](1);`{:.language-c++}  
  
2\. Erzeuge erwin „statisch“, nicht dynamisch (auch wenn man damit auf die „coolen Pointerpfeile“ verzichten muss):  
  
`Vector<int> erwin;`{:.language-c++}  
  
Schönen Sonntag,  
Robert