Konstruktor domniemamy podczas pracy na vectorze klasy.

Odpowiedz Nowy wątek
2011-09-20 01:19
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?

Pozostało 580 znaków

2011-09-20 01:35
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/


"(...) otherwise, the behavior is undefined".
edytowany 1x, ostatnio: Endrju, 2011-09-20 01:35

Pozostało 580 znaków

2011-09-20 09:51
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.


Szacuje się, że w Polsce brakuje 50 tys. programistów
w większości przypadków nie trzeba nic implementować. - Azarien 2011-09-20 14:51
Wole chuchać na zimne. Patrz poniżej - np. obiekt ze wskaźnikiem lub innym auto-ptr-em. - vpiotr 2011-09-20 16:17

Pozostało 580 znaków

2011-09-20 10:04
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 :)

Będzie się psuć w różnych momentach, np. sortowanie, wstawianie, kasowanie. Ale kompilator to przepuści (niestety). - vpiotr 2011-09-20 10:16
byłoby uciążliwe wymaganie operatorów, wymyślnych konstruktorów, kiedy wszystko czego potrzebujesz to zastąpić tablicę wektorem. - Azarien 2011-09-20 15:04

Pozostało 580 znaków

2011-09-20 15:13
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.


"(...) otherwise, the behavior is undefined".

Pozostało 580 znaków

2011-09-20 15:48
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.

Pozostało 580 znaków

2011-09-20 18:48
asdfghjkl
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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