vector wskaźników na obiekt

0

Witam. Mam problem z wyświetleniem zawartości vectora, który jest typu class i zawiera wskaźniki. W klasie ma zmienne typu int,string double. Definicja wektora :

 vector <wektor*> wektory;

Moja próba wyświetlenie zawartości wektora:

for (size_t i = 0; i < wektory.size(); i++)
		cout << "%d, " << wektory[i]; 

Jednak wyświetla mi cyfry i litery... Czy może ktoś pomóc?

0

wektory[i] jest referencją do elementu, czyli wektor*. Zależnie od tego czym jest wektor musisz odpowiednio zadziałać.

0

wektor to klasa... wiem, że element dodaje się za pomocą push.back... ale nie wiem jak wyświetlić zawartość vectora

0

Jak masz przeładowany ostream& operator<<(ostream&, wektor const&) to wytarczy cout << *wektory[i].

Dużym błędem jest nazywanie w tak mylący sposób klas, teraz nie wiem czy zamiennie ich używasz i czy dobrze rozumiesz co się dzieje.

0
cout << *wektory[i]

sprawia że kompilator wywala mi błędy :

Błąd	1	error C2679: dwuargumentowy "<<" : nie znaleziono żadnego operatora, który przyjmuje prawostronny operand typu "wektor" (lub nie istnieje akceptowalna konwersja)
	2	IntelliSense: no operator "<<" matches these operands
            operand types are: std::basic_ostream<char, std::char_traits<char>> << wektor
0

A przeciążyłeś operator<< dla klasy wektor?

0

Dlatego pytałem, czym jest wektor. Jak tego nie wiem to nie mogę Ci pomóc (nie mam działającej szklanej kuli).

0

Dobrze, przepraszam.

vector <wektor*> wektory; 

wektor* - to klasa (mam w niej utworzony obiekt)
wektory - to nazwa mojego wektora
Z przeciążaniem mam problem, próbuję według http://cpp0x.pl/artykuly/?id=15 ale nie wiem jak to zrobić :/

0
ostream & operator << (const wektor &wektory); 

to jest moje przeciążenie

0

Zobacz jaką deklarację operatora << ja podałem:

ostream& operator<<(ostream& o, const wektor& w);
0

Czy mógłbyś mi wytłumaczyć?
Nadal mam ten sam błąd :/

0

Jak czytałeś ten kurs, przecież tam jest:

std::ostream & operator <<( std::ostream & s, const Vector & v )
{
    return s << '<' << v.x << ',' << v.y << '>';
}

Teraz podmień Vector z tego kodu na swój wektor i masz prawidłową sygnaturę

0

To kod przeciążenia:

 ostream& operator<<(ostream & o, const COsoba & w) {
	o << w;
	return o;
}

a to metoda której używam do wyświetlenia zawartości wektora:

 void Klasa::pokazWektory() {
	for (size_t i = 0; i < wektory.size(); i++)
		cout << "%d, " << *wektory[i];
}

jednak nadal nie wyświetla mi poprawnie :/

0
o << w;

Tutaj wywołujesz funkcję, którą właśnie próbujesz zaimplementować. Myślisz, że kompilator sam się domyśli co chcesz zrobić?

2

teraz tak się pracuje na const wartościach kontenerów w cpp

potraktuj shared_ptr jak zwykły pointer u Ciebie

#include <iostream>
#include <vector>
#include <memory>

struct A
{
	A(int val) : a(val) {}
	
	int a;
};

int main() {
	std::vector<std::shared_ptr<A>> avec;

	for(auto i = 0 ; i < 10 ; ++i) {
		avec.push_back(std::make_shared<A>(i));
	}

	for(auto const& e : avec) {
		std::cout << e->a << std::endl;
	}

	return 0;
}

http://ideone.com/ejGYM1

edit:
poddać się musiałem komentarzom

0
o << w;

w jest obiektem typu COsoba, ale przecież jeszcze nie zaimplementowałeś operator<< dla tej klasy.
Przykładowo to mogłoby tak wyglądać:

class COsoba
{
    public:
         string imie;
         string nazwisko;
         int wiek;
};

ostream& operator<<(ostream& o, const COsoba& w)
{
    o << "Mam na imie " << w.imie << " i jestem z rodu " << w.nazwisko << ". Mam lat " << w.wiek;
    return o;
}

To jest poprawne, bo klasa string ma już przeciążony operator<<, a typy proste są automatycznie obsługiwane.

0

nie rozumiem nadal...

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