Verbesserung an Template Klasse gegen Array Überlauf



  • Ok! Weiß zwar noch nicht über asserts aber kann mir ja das Wissen aneignen 😃

    Wäre mal gut wenn du mal auf Seite 4 schauen würdest da habe ich dir noch ne Menge fragen gestellt(letzer Beitrag(Die assert frage hat sich dann wohl da geklärt))...



  • Freak_Coder schrieb:

    Wäre mal gut wenn du mal auf Seite 4 schauen würdest da habe ich dir noch ne Menge fragen gestellt(letzer Beitrag...

    dachte, alles sei geklärt.

    mit leer meinte ich uninitialisiert. siehe http://www.volkard.de/Cpp/Tutorial/Grundlagen/Variablen/index.html

    und ja, ich meine eine array-klasse um ein normales array. der wunsch müßte auf seite 1 schon stehen.

    template<class typ,int size> class MyArray {
    	typ array[size];
        public: 
    	typ &operator[] (unsigned int i); 
        const typ &operator[](unsigned int i) const; 
    };
    

    und in die op[] fein assert oder irgendwas rein.



  • Wenn ich das richtig gesehen habe gibt der op= immer noch ne Kopie zurück und ist damit noch etwa doppel so langsam wie er sein müßte.



  • Habe jetzt meine Klasse wieder umgeändert, nur gibt es etwas was ich noch nicht verstehe:

    template<class typ,int size> MyArray<typ,size>::MyArray() 
    :array(new typ[size])// Mit dieser schreibweise ruft man doch ander Ctors auf oda
    ,aktSize(size)        // aber was hat array() und aktSize() da zu suchen (nichts kapisch)
    { 
    }
    

    Einer ne Erklärung vielleicht oder nen Link ???



  • Freak_Coder schrieb:

    Einer ne Erklärung vielleicht oder nen Link ???

    weder noch. ich hab da gelogen. deine version ist hübscher.



  • 😕 😕 Häää, wenn das so ist !
    Aber gibt es diese Schreibweise wirklich oder auch gelögen oda ??? 😕

    Und was war damit:

    volkard schrieb:

    template <class typ,int size> const typ &MyArray<typ,size>::operator[](unsigned int i) const   
    { 
                  if(i<aktSize) 
                                return array[i]; 
                  else 
                                throw out_of_range("Out of Range !!!");   
            
    }
    

    was soll das denn? das widerstebt mir. irgendwas ist da ganz komisch.

    Ist da auch was gelogen oder? Caipi meinte ich solls so machen ?



  • Freak_Coder schrieb:

    😕 😕 Häää, wenn das so ist !
    Aber gibt es diese Schreibweise wirklich oder auch gelögen oda ??? 😕

    die gibt es. und irgendwann wird sie besser als die jetzige. im moment ist die jetzige besser weil übersichtlicher.

    Und was war damit:

    volkard schrieb:

    was soll das denn? das widerstebt mir. irgendwas ist da ganz komisch.

    Ist da auch was gelogen oder? Caipi meinte ich solls so machen ?

    das widerstebt mir wirklich. irgendwas ist da wirklich ganz komisch.

    das klint so, als wolle man programmierfehler zur laufzeit fangen und heilen.



  • Weil ich irgendwie nicht verstehe was du meinst werde ich es einfach mal rausnemen und nur ein return (vorerst) reinsetzten.



  • Hier nun nochmal alles:

    template<class typ> class MyArray {
    
                   typ* array;
                   int aktSize;
                   void grow(size_t newSize);
        public:
                   MyArray(size_t size);
                   MyArray(const MyArray &Array_kopie);
                   MyArray(size_t size,typ* arr_anfang,typ* arr_ende);
    
                   MyArray &operator=(const MyArray& a);
                   typ &operator[] (unsigned int i);
                   const typ &operator[](unsigned int i) const;
    
                    ~MyArray() { delete [] array; }
    
    };
    
    template<class typ> MyArray<typ>::MyArray(size_t size)
    {
                   aktSize=size;
                   array=new typ[size];
    }
    
    template<class typ> MyArray<typ>::MyArray(const MyArray &Array_kopie)
    {
                  array=new typ[Array_kopie.aktSize];
                  aktSize=Array_kopie.aktSize;
                  for(int i=0;i<Array_kopie.aktSize;i++)
                           array[i]=Array_kopie.array[i];
    }
    
    template<class typ> MyArray<typ>::MyArray(size_t size,typ* arr_anfang, typ* arr_ende)
    {
                   aktSize=size;
                   array=new typ[size];
    
                   for(int i=0;&(arr_anfang[i])!=arr_ende;i++)
                   array[i]=arr_anfang[i];
    
    }
    
    template <class typ> typ &MyArray<typ>::operator[](unsigned int i)
    {
             if(i>aktSize) grow(i);
             return array[i];
    }
    
    template <class typ> const typ &MyArray<typ>::operator[](unsigned int i) const
    {
                  return array[i];
    }
    
    template <class typ> MyArray<typ> &MyArray<typ>::operator=(const MyArray& a )
    {
             if(aktSize<a.aktSize)
             {
               delete [] array;
               array=new typ[a.aktSize];
             }
    
             MyArray temp(a);
             std::swap(array,temp.array);
             std::swap(aktSize,temp.aktSize);
    
             return *this;     
    }
    
    template <class typ> void MyArray<typ>::grow(size_t newSize)
    {
             int altSize=aktSize;
    
             aktSize=newSize * 2;
    
             typ* temparray=new typ [aktSize];
    
             for(int i=0;i<altSize;i++)
                     temparray[i]=array[i];
    
             delete [] array;
             array=temparray;
    
    }
    
    //----------------------------------------------------------------------------
    
    template <class typ,size_t size> class StaticArray {
    
                    typ array[size];
            public:
                    StaticArray() { }
                    StaticArray(typ* arr_anfang,typ* arr_ende);
    
                    typ &operator[] (unsigned int i);
                    const typ &operator[](unsigned int i) const;
    
    };
    
    template<class typ,size_t size> StaticArray<typ,size>::StaticArray(typ* arr_anfang, typ* arr_ende)
    {
                   for(int i=0;&(arr_anfang[i])!=arr_ende;i++)
                   array[i]=arr_anfang[i];
    
    }
    
    template <class typ,size_t size> typ &StaticArray<typ,size>::operator[](unsigned int i)
    {
                  assert(i<size);
                  return array[i];
    }
    
    template <class typ,size_t size> const typ &StaticArray<typ,size>::operator[](unsigned int i) const
    {
                  assert(i<size);
                  return array[i];
    }
    

    In was für einen Datei speichert man am besten nun so was ab um nachher damit in eigenen Programmen arbeiten zu können.

    Und sonst alles diesmal in ORDNUNG ....



  • das ganze kommt am besten in einen eigenen header, also eine *.hpp 🙂


Anmelden zum Antworten