Wektor obiektów i sprytne wskaźniki

0

Cały dzień już siedziałem nad tą jedną linijką kodu i do niczego nie doszedłem, prosiłbym o pomoc. Jak odczytać zmienne znajdujące się wewnątrz obiektów typu Punkt?

Mam dwie klasy, jedna "niższa" Punkt przechowuje jedną zmienną typu time_t i jedną tablicę dwuelementową typu double.

Druga klasa Zbior przechowuje wektor obiektów typu Punkt, posiada metodę dodaj_punkt, zwroc_ilosc_punktow oraz zapisz_punkty.

#include <iostream>
#include <stdio.h>			// Pliki
#include <time.h>          // czas
#include <vector> 				// Wektory
#include <boost/shared_ptr.hpp>		// Wskaźniki zła

using namespace std;
using namespace boost;

class Punkt
{
public:
	Punkt(double X, double Y, time_t czas);
	Punkt();
	~Punkt();
	int ustaw_wspolzedne(double X, double Y);
	int ustaw_czas(time_t czas);
	void pobierz_wspolzedne(double *wspolzedne);
	double zwroc_X();
	double zwroc_Y();
	time_t zwroc_czas();
	
private:
	double wspolzedne [2];   	// Współżędne konkretnego punku
	 time_t czas_pomiaru;   	// Czas w jakim został dokonany pomiar
};


class Przejazd : public Punkt
{
public:
	vector <shared_ptr<Punkt> > punkty;   // Wektor wskaźników na struktury
	Przejazd();
	~Przejazd();
	int dodaj_punkt(double X, double Y, time_t czas);
	int zwroc_ilosc_punktow();
	int zapisz_punkty();
};


int Przejazd::dodaj_punkt(double X, double Y, time_t czas)
{
	shared_ptr<Punkt> nowy(new Punkt(X, Y, czas) );
	punkty.push_back(nowy);   			// Utwórz element na końcu wektora
	return 0;
}

int Przejazd::zapisz_punkty()
{
	while( !punkty.empty() ) 				// Dopóki nie jest vektor pusty
	{
		//~ cout << punkty.end()->zwroc_czas()   <<endl;  // Tak było by logicznie?
		cout << (*punkty.end())->zwroc_czas()    <<endl;  // Tylko tak kompilator przyjmuje
		
		punkty.pop_back();
	}
}


int Przejazd::zwroc_ilosc_punktow ()
{
	return punkty.size();
}

Podczas kompilacji nie dostaje nawet ostrzeżenia a gdy wchodzi do metody zapisz_punkty to:

err: /usr/include/boost/smart_ptr/shared_ptr.hpp T* boost::shared_ptr< <template-parameter-1-1> >::operator->() const [with T = Punkt]: Assertion `px != 0' failed.

Czyli niezainicjowany wskaźnik?

0

punkty.end() zawsze wskazuje poza kontener! Poczytaj dokładniej o kontenerach w STL!
A jeszcze lepiej to użyj: back

0

Dokładnie tak. Błędnie wybrana metoda. Dzięki za pomoc.
Powinno być
cout << punkty.back()->zwroc_czas() <<endl;

Wielkie dzięki za pomoc :)

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