Jeszcze raz wskaźniki

0

Witam,
mam takie pytanie odnosnie obiektów tymczasowych oraz wskaźników:
Mianowicie, które zastosowanie będzie lepsze, czy wychodzi na to samo?

Rozwiązanie 1

 
std::vector<Obiekt> obiekty;

Obiekt ob;    (!)
(...) //jakies tworzenie obiektu ob (np wpisywanie zmiennych z XMLa)
obiekty.push_back(ob);

i tu pytanie czy do wektora zostaje wpisany obiekt ob, siedzi sobie tam, a ten pierwszy obiekt oznaczony przeze mnie jako (!) ginie?

Rozwiązanie 2

 
std::vector<Obiekt*> obiekty;

Obiekt* ob = new Obiekt()    (!)
(...) //jakies tworzenie obiektu ob (np wpisywanie zmiennych z XMLa)
obiekty.push_back(&ob);

?

0
http://www.cplusplus.com/reference/stl/vector/push_back/ napisał(a)

void push_back ( const T& x );
Add element at the end
Adds a new element at the end of the vector, after its current last element. The content of this new element is initialized to a copy of x.

Pogrubiłem dla czytelności. Następnym razem użyj Google.

0

@1. w wektorze siedzi kopia obiektu. oryginalny obiekt zginie, gdy wypadnie z zasięgu (np. pod koniec bieżącej funkcji)
@2. błąd składni. ob jest typu Obiekt*, a do wektora próbujesz wrzucić wartość typu Obiekt**.

Następnym razem użyj Google.
to może darujmy sobie w ogóle forum, bo „wszystko co można napisać zostało już napisane i można to znaleźć w Google”

0

Ależ ja to widziałem, czytałem, jednak chcę się upewnić.
Z tego przykładu wiem tyle że za każdym razem wpisywany jest nowy obiekt do vecotra ale mnie chodzi o to czy
jeśli tworzę obiekt tymczasowy w jakiejś funkcji i potrzebuje te obiekty wpisywać do vectora
to lepiej
a) wpisywać po prostu te tworzone obiekty
b) wpisywać wskaźniki do nich

0

Azarien:

fakt, źle napisałem, ale chodziło mi po prostu o wpisanie wskaźnik na obiekt tymczasowy.
Problem opisany w poście wyżej.

Dzięki za odzew

0

Mnie zawsze interesowało to, czy wywołując np. vector_obiektow.push_back(obiekt(dane,do,konstruktora)) nie zostanie to zoptymalizowane. O ile dobrze pamiętam to kompilator ma prawo zoptymalizować obiekt nowy=funkcja_zwracająca_obiekt_przez_wartosc(), nawet jak konstruktor kopiujący ma efekty uboczne.

0

Zamiast vector<Obiekt *> użyj boost::ptr_vector.

Zalety:

  • może przechowywać obiekty dowolnej klasy (w vector<Obiekt> nie)
  • samo zwalnia obiekty

Przykład:
http://www.bnikolic.co.uk/boostqf/pointer_container.html

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