Piszę następującą tablicę (klasę), która zwiększa rozmiar, gdy indeks tej tablicy jest większy niż rozmiar tej tablicy. Wiem o wektorach, ale musi to być tablica. Kod wygląda następująco:Klasa - Zdefiniowana przez użytkownika inteligentna tablica o rozmiarze dynamicznym
#include <iostream>
using namespace std;
class Array {
public:
Array():_array(new float[0]), _size(0){};
~Array() {delete[] _array;}
friend ostream &operator<<(ostream&,const Array&);
float& operator[] (int index)
{
if(index>=_size)
{
float* NewArray=new float[index+1];
for(int i=0;i<_size;++i) NewArray[i]=_array[i];
for(int i=_size;i<index+1;++i) NewArray[i]=0;
delete[] _array;
_array=NewArray;
_size=index+1;
}
return _array[index];
}
private:
float *_array; // pointer to array
int _size; // current size of array
};
ostream &operator << (ostream &out, const Array& obj) // overloading operator<< to easily print array
{
cout << "Array:\n\n";
for (int i=0;i<obj._size;++i)
{
cout << obj._array[i];
if(i+1!=obj._size) cout << ", ";
}
cout << ".\n";
return out;
}
int main()
{
Array CustomArray;
CustomArray[2] = CustomArray[1] = CustomArray[0] = 3.14; // **here is the problem**
cout << CustomArray << endl;
}
Wszystko jest ok, 0 ostrzeżenia, 0 Valgrind błędy, Wyjście:
3.14, 3.14, 3.14.
ALE mam napisać ten kod (w głównym) w ten sposób:
CustomArray[0] = CustomArray[1] = CustomArray[2] = 3.14;
i teraz to 3 błędy Valgrind: Adres (some_address) wynosi 4 bajty wewnątrz bloku rozmiar 8 free'd,
i wyjście wygląda tak: 0, 0, 3.14.
niestety muszę napisać ten kod do pracy drugą drogę (CustomArray[0] = CustomArray[1] = CustomArray[2] = 3.14;
) Można Chłopaki pomóc? Z góry dziękuję
Problem polega na tym, że 'CustomArray [1]' unieważnia wszystkie poprzednie odniesienia i wskaźniki do danych, ponieważ jest ponownie przydzielany. Co możesz zrobić, to zwrócić 'ArrayAccess', który przechowuje indeks i nie posiada odwołania, ale uzyskuje dostęp do oryginalnej tablicy za każdym razem. – WorldSEnder
Hmm, nie sądzę, że nawet 'std :: vector' może sobie z tym poradzić, jeśli jedno z tych wywołań operatora []' spowoduje realokację ... – cdhowie