przydzielanie pamieci bez konstruktora domyslnego

0

Witam!

Mam taki problem:

Mam klase Student w ktorej nie moge uzyc konstruktora domyslnego i mam takie zadanie :

Utworzyc tablice 2 wskaznikow do obiektow klasy student, czyli : student * stu[2];
a nastepnie zarezerwowac pamiec dla 10 obiektow w stu[0] i zainicjowac je tymi samymi danymi i tu sie pojawia problem, nie mam pojecia jak to zrobic nie majac konstruktora domyslnego.
Mam nadzieje ze w miare zrozumiale opisalem problem :)

0

Szczerze się przyznam, ze mimo wszystko srednio rozumiem, o co Ci chodzi ;p

Ale może dobrze zrozumialem, wiec poradze cos, co mi przyszlo do glowy:

Aby utworzyc studenta bez konstruktora domyslnego:

  1. maalokujesz pamiec o rozmiarze takim, jaki by zajmowal student ( sizeof student )
    1.1 to Ci daje wskaznik na poczatek tej pamieci
  2. nastepnie rzutujesz ten wskaznik na (student*), czyli wskaznik na strudenta
  3. nastepnie wywolujesz tam moj_wskaznik->zainicjuj_pola_w_klasie_student();
    3.1 gdzie ta metoda o dluuugiej nazwie ma zrobic to, co zrobilby normalnie konstruktor.

Mam nadzieje, ze to zadziala, bo szczerze mowiac nigdy nic takiego nie robilem ;p

0

A da sie jakos zarezerwowac pamiec dla tablicy obiektow i uzyc do tego jednych danych, cos takiego
Student * Student = new Student[10] ( argumenty konstruktora );
tzn jednoczesnie zarezerwowac pamiec dla 10 obiektow i kazdemu przekazac do konstruktora te same dane?

0

hmm nie wiem czy dobrze rozumiem ale moze zadanie polega na tym abys stworzyl fabryke

class Student
{
protected:
    Student() {}
    ~Student() {}
public:
    static Student* create() { return new Student; }
    static void destroy(Student* s) { delete s; }
};

//...

Student* s = Student::create();
//....
Student::destroy(s);
0

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;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1