Mam szablon klasy
template <class T, int size>
class Klasa { public: T* Obiekty; }
W niej tablice obiektów klasy T;
W pewnej funkcji chce wykonać kopie tablicy Obiekty tak, aby każdy obiekt w nowej tablicy był utworzony za pomocą konstruktora kopiującego klasy T.
Obiekty = new T[size]; //tak alokuje Obiekty.
T* Kopia;
Kopia = new T[size](Obiekty); //tak nie działa, błąd: "Array allocated using 'new' may not have an initializer"
Kopia = calloc(size, sizeof(T));
for(int i = 0; i < size; i++)
Kopia[i].T(Obiekty[i]); //żałosna próba wywołania konstruktora kopiującego, oczywiście zakończona błedem kompilatora "structure required on left side of ."
Wpadłem na jeszcze jeden pomysł
Kopia = calloc(size, sizeof(T));
T* pt;
for(int i = 0; i < size; i++)
{
pt = new T(Obiekty[i]);
memcpy(Kopia + i, Obiekty + i, sizeof(T));
free(pt);
}
Jednak to stwarza pewne niebespieczeństwo. Załóżmy że konstrukor klasy T gdzieś tam zapisuje wskaźnik this. Po operacji memcpy wskaźnik ten sie zmieni i zapis będzie błędny.
A więc czy da sie wywołać konstruktor kopiujący na już przydzielonym obszarze pamięci ?