C++ Operator [] überladen



  • cooky451 schrieb:

    Sone schrieb:

    Neh, ich will jetzt mal hören wieso das so viel Sinn macht. Von cooky seiner Majestät höchstpersönlich.

    1. Konzeptuell modelliert ein vector, wie fast alles mit operator[], eine Art Arrayzugriff. In jedem fall möchte man mit [] auf ein Element selbst zugreifen - und das wird eben genau mit einer Referenz erreicht. Äquivalent steht dazu das Ziel von C++, Klassentypen als Built-In Typen zu behandeln. (Bei einem konstanten Array gibt es natürlich auch einen const&.) Eine konstante Referenz ist also nur konsistent mit dem Rest der Sprache.

    2. Praktisch gesehen willst du uU mal sowas:

    send(&v[5], xyz);
    

    Ja, man kann auch v.data() + 5 schreiben, aber da könnte man ja auch *(v.data() + 5) = 77 bei non-const schreiben. Der Punkt ist, dass das nicht das Verhalten ist, was man erwartet.

    Hmm, zugegeben, wenn ich mir das so durchlese, sehe ich langsam ein dass du Recht hast.



  • template<class T,std::size_t D>
    class Array
    {
      vector<T>* vec;
    
      public:
      // 1. einen Konstruktor Vector() besitzen, der den Inhalt mit Nullen initialisiert
      Array()
      {
        this->vec = new vector<T>(D,0);
      }  
    
      public: 
      // 2. den Index-Operator [] überladen, damit man auf die einzelnen Elemente des Vektors zugreifen kann.
      T& operator [] (std::size_t i) 
      { 
        return vec[i]; 
      } 
    
      public: 
      // 2. den Index-Operator [] überladen, damit man auf die einzelnen Elemente des Vektors zugreifen kann.
      const T& operator [] (std::size_t i) const 
      { 
        return vec[i]; 
      }
    
      public:
      // 3. den Additionsoperator + überladen, so dass man mit den entsprechenden Aufrufen Vektoren addieren kann.
      Array<T,D>& operator + (Array<T,D>& input)
      {
        Array<T,D> temp;
        for(long i = 0; i < D; i++)
          temp[i] = this[i] + input[i];
      }
    
      public:
      // 5. eine Funktion length() besitzen, die einem die Länge des Vektors (euklidische Norm) zurückgibt.
      long length()
      {
        double l = 0.0;
        for(long i = 0; i < D; i++)
          l += pow(this[i],2);
        l = sqrt(l);
    
        return D;
      }
    
      public:
      // 6. eine Funktion print() besitzen, die den Inhalt des Vektors auf dem Bildschirm ausgibt.
      void print()
      {
        for(long i = 0; i < D; i++)
          cout<<"["<<*this[i]<<"]";
        cout<<endl;
      }
    };
    

    Der vector vec soll direkt per []-Operator gelesen/beschrieben werden können. Wo ist mein Fehler?

    Vielen Dank für Eure Hilfe.



  • Wozu der Pointer und der new Kram?



  • @Sone: Die const Referenz wird aber von der non-const Methode zu einer normalen Referenz gecasted, was unmöglich wäre wenn die const Methode einfache char zurückgibt.



  • Höchstwarscheinlich weil ich es nicht besser kann ;). Falls ich es direkt initialisieren kann nur her mit Lösungen =). Ich denke ich muss nicht bemerken das ich Anfänger bin...



  • pyhax schrieb:

    @Sone: Die const Referenz wird aber von der non-const Methode zu einer normalen Referenz gecasted, was unmöglich wäre wenn die const Methode einfache char zurückgibt.

    Ach Mist! Das hab ich völlig übersehen 😃



  • template <typename T, std::size_t S>
    class Array
    {
      std::vector<T> v_;
    
    public:
      Array()
        : v_(S) // "Initialisierungsliste"
      {}
    };
    

    Kommst du von Java oder so? In C++ sind Pointer eher selten.

    Edit: Von den anderen Methoden her macht ein std::vector im Übrigen wenig Sinn. Da wäre eher sowas angebracht:

    template <typename T, std::size_t S>
    class Array
    {
      std::array<T, S> v_;
    };
    


  • cooky, meinst du nicht eher: Speicher selbst allokieren (und damit verwalten) ist in C++ eher unüblich?

    P.S.: Ein Hinweis auf C++11 wäre angebracht, ist ja noch Anfänger... (wegen std::array )



  • Also die Aufgabe soll einen n-dimensionalen Vektor simulieren. Array stammt noch aus einem eigenen Projekt daher einfach Array durch Vektor ersetzen. Mein Fehler.



  • Das war nicht der Punkt. Wenn man z.B. eine Vektorklasse für Spiele implementiert will man da nicht noch eine Dereferenzierung drin haben. Daher das std::array,



  • Das mag sein, trotzdem ist meine Aufgabenstellung so gegeben. Kann ich nix dran ändern.


Anmelden zum Antworten