Konstruktor domniemamy podczas pracy na vectorze klasy.

0

Posiadając konstruktor domniemany w klasie "bus" mogę w łatwy sposób utworzyć kilka obiektów tej klasy poprzez wskaźnik, np:

bus* Buses = new bus[ number ];

Chciałem jednak pozamieniać wszelkie dynamiczne alokacje pamięci w moim programie na vectory. Czy jest na to jakiś sposób, żeby

 std::vector < bus > Buses 

zainicjował automatyczne tworzenie tych obiektów czy w tym przypadku muszę pozostać przy pracy na wskaźniku?

0

Wystarczy przeczytać dokumentację:

std::vector::vector(size_type n, const T& value= T(), const Allocator& = Allocator());

Jak widzisz dwa parametry tego konstruktora mają wartości domyślne, pierwszy z nich to ilość elementów w wektorze. Jak się pewnie domyślasz zostanie uruchomiony dla nich domyślny konstruktor, gdyż w C++ nie mogą istnieć nieskonstruowane obiekty.

Będziesz więc miał:

std::vector<bus> Buses(number);

http://www.cplusplus.com/reference/stl/vector/

0

Z tym że żeby swoją klasę trzymać w std::vector, trzeba w niej zaimplementować kilka rzeczy.

http://www.processdoc.com/cppstl/objreq.html

Jeśli nie chce Ci się jej rozszerzać, możesz użyć boost::ptr_vector, z tym że obiekty będziesz musiał zainicjować sam.

0

Dzięki wielkie za pomoc. Po dopisaniu pierwszego argumentu wszystkie obiekty ładnie się skonstruowały.

Z tym że żeby swoją klasę trzymać w std::vector, trzeba w niej zaimplementować kilka rzeczy.

To oznacza, że kompilator powinien zgłosić błąd? Bo moja klasa posiada wyłącznie konstruktor domniemany i wszystko ładnie działa :)

0

Dla prostych klas niczego nie musisz dodawać. Jeżeli Twoja klasa zawiera wskaźniki albo jakieś inne cuda, to możesz chcieć zrobić jej konstruktor kopiujący i operator przypisania. Jeżeli masz zamiar sortować, wstawiać czy kasować za pomocą funkcji z <algorithm> będziesz musiał zaimplementować odpowiednie operatory. Gdybyś chciał ich użyć kompilator zgłosi błąd, nie wiem skąd pomysł, że nie.

Ponieważ operator przypisania i konstruktor kopiujący są generowane przez kompilator, Twoja klasa spełnia wymagania podane w linku. Pytanie brzmi czy domyślne wersje są dla Ciebie odpowiednie.

0

Prostym rozwiązaniem może być też vector wskaźników na obiekty. Dochodzi nam zarządzanie pamięcią przez new/delete, ale wiemy dokładnie ile powstaje obiektów i kiedy są niszczone.

0

Idąc tą drogą można użyć boost::ptr_vector

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