Array-Template und Operator []



  • Hallo zusammen,

    ich möchte nen Template schreiben, das
    die Funktionalität eines Arrays besitzt.
    Mir ist bekannt, dass sowas in z. B.
    QT bereits existiert. Ich mache das nur um
    C++ zu lerrnen.

    Hier ist mein bisheriger Code:

    template<class type>
    class SArray {
    public:
      SArray(unsigned int length){
        this->length = length;
        first = (type*)malloc(length*sizeof(type));
        first[0] = (int)1516;   // Feld 0 = 1516
        first[sizeof(type)] = (int)2304; // Feld 1 = 2304
      }
    
      ~SArray(){
        free(first);
      }
    
      type operator[](int i){
        return first[i*sizeof(type)];
      }
    
    private:
      unsigned int length;
      type *first;
    
    };
    

    Die Ausgabe der bei der Initialisierung festgelegten Werte
    funktioniert.

    SArray<int> a(2);
      Logger::debug(QString::number(a[0])); // Gibt 1516 aus.
      Logger::debug(QString::number(a[1])); // Gibt 2304 aus.
    

    Die Zuweisung funktioniert allerdings nicht:

    a[0] = 2016; //  error: non-lvalue in assignment
    

    Kann mir jemand sagen wie ich das hinkriege, dass ich
    auf das Template genau zugreifen kann wie auf ein Array?

    Muß ich ein Template überhaubt im Header implementieren oder
    wie kreig ich das sonst hin?

    Gruß,
    CSpille

    PS: Falls irgendwelche anderen Fehler in dem Code sind,
    könnt ihr mir das auch gerne sagen. 😉



  • CSpille schrieb:

    Hallo zusammen,

    ich möchte nen Template schreiben, das
    die Funktionalität eines Arrays besitzt.
    Mir ist bekannt, dass sowas in z. B.
    QT bereits existiert. Ich mache das nur um
    C++ zu lerrnen.

    Hier ist mein bisheriger Code:

    template<class type>
    class SArray {
    public:
      SArray(unsigned int length){
        this->length = length;
        first = (type*)malloc(length*sizeof(type));
        first[0] = (int)1516;   // Feld 0 = 1516
        first[sizeof(type)] = (int)2304; // Feld 1 = 2304
      }
    
      ~SArray(){
        free(first);
      }
    
      type operator[](int i){
        return first[i*sizeof(type)];
      }
    
    private:
      unsigned int length;
      type *first;
      
    };
    

    Die Ausgabe der bei der Initialisierung festgelegten Werte
    funktioniert.

    SArray<int> a(2);
      Logger::debug(QString::number(a[0])); // Gibt 1516 aus.
      Logger::debug(QString::number(a[1])); // Gibt 2304 aus.
    

    Die Zuweisung funktioniert allerdings nicht:

    a[0] = 2016; //  error: non-lvalue in assignment
    

    Kann mir jemand sagen wie ich das hinkriege, dass ich
    auf das Template genau zugreifen kann wie auf ein Array?

    Du musst eine Referenz auf type liefern:

    type& operator[](int i);
    //und wenn wir gerade schon dabei sind
    const type& operator[](int i);
    

    Muß ich ein Template überhaubt im Header implementieren oder
    wie kreig ich das sonst hin?

    Du kannst das auch Trennen x.hxx und x.cxx. Dann gehst du hin und includierst
    x.cxx am Ende von x.hxx. Ansonsten muss alles in der Header stehen.

    mfg
    v R



  • Danke schonmal...

    Ah als Referenz zurückgeben...
    Bisher hab ich mich immer vor referenzen gedrückt 😉

    Gruß,
    Daniel



  • virtuell Realisticer schrieb:

    type& operator[](int i);
    //und wenn wir gerade schon dabei sind
    const type& operator[](int i);
    

    const vergessen

    const type& operator[](int i) const;
    


  • Dafuer hab ich ja dich :). Danke

    mfg
    v R


Anmelden zum Antworten