Znowu jakiś buc wymyślił "świetne" zadanko i zgaduj o co mu chodzi. W końcu końców pewnie się okaże, że i tak ten konstruktor domyślny musi być zawołany (np. wspomniana fabryka), albo że klasa może zawierać jedynie pola które nie wymagają wołania konstruktora przy ich tworzeniu (tzw. "raw structure" czy jakoś tak).
Jedyny sposób na to aby utworzyć tablicę obiektów nie używając konstruktora domyślnego jest "miejscowy" operator new:
#include <string>
#include <new>
using namespace std;
class Student
{
private:
string imie; //przykładowe dane
public:
Student(const string &_imie): imie(_imie) { } //konstruktor nie-domyślny
};
Student* TworzTablice(const string &imie, unsigned rozmiar)
{
//przydzielamy pamięć, na razie w tablicy nie ma obiektów
Student *tablica = (Student*)malloc(sizeof(Student) * rozmiar);
//wywołujemy konstruktor na każdej z komórek tablicy, po tej operacji stją się obiektami
while(rozmiar-- > 0)
new(&tablica[rozmiar]) Student(imie);
return tablica;
}
//utworzona jak wyżyj tablica wymaga specjalnego niszczenia
void NiszczTablice(Student* tablica, unsigned rozmiar)
{
//analogicznie jak przy tworzeniu - wywołujemy destruktor na każdej komórce
while(rozmiar-- > 0)
tablica[rozmiar].~Student();
//i zwalniamy pamięć
free(tablica);
}
int main(int argc, char* argv[])
{
Student *stu[2];
stu[0] = TworzTablice("Rambo", 10);
//...
NiszczTablice(stu[0], 10);
return 0;
}