vector wskaźników wyświetlenie

0

Witam was.
Mam problem z wyświetleniem zawartości kontenera, który przechowuje u mnie wskaźniki na obiekty.

vector <COsoba*> uczestnicy; 

Elementy dodaję w ten sposób :

void CWycieczka::dodajUczestnika(COsoba* uczestnik){
	uczestnicy.push_back(uczestnik);
};
 

A wyświetlić próbuję w ten sposób :

void CWycieczka::pokazListeUczestnikow() {
	for (int i = 0; i < uczestnicy.size(); i++)
	{
		cout << uczestnicy[i] << endl;
	}
} 

Wiem, że trzeba(?) użyć przeciążania jednak nie mogę sobie z tym poradzić. Może ktoś naprowadzi mnie?

0

cout << *(uczestnicy[i]) << endl;

0

Niestety nadal mam problem. Oto moje przeciążenie, które znalazłem w internecie (chyba nawet na tym forum) :

ostream& operator << (ostream & os, const COsoba & u) {
	os << u;
	return os;
} 
0
ostream& operator << (ostream & os, const COsoba & u) {
    os << u.Składowa1<<' '<<u.Składowa2;
    return os;
}
0

Czy możesz mi powiedzieć czym jest Składowa1 i Składowa2?

0

To są składowe klasy COsoba

0

Czyli np. imie?

0

Przykro mi nie jestem wróżbitą.

0

Dobrze, już wiem. Jednak moje składowe w klasie są private, nie bardzo wiem jak się do nich teraz dostać:

COsoba::ostream& operator << (ostream & os, const COsoba & u) {
	os << u.imie << ' ' << u.nazwisko;
	return os;
} 

Takie coś nie przechodzi :/

1

Po pierwsze: ostream &operator << (ostream & os, const COsoba & u)
Po drugie jest trzy drogi:

  1. friend
  2. string getIme()const { return imie; }
  3. ostream &prn(ostream & os)const { return os<<imie<<' '<<u.nazwisko; } zaś w operatorze return u.prn(os);
0

Zaprzyjaźnij się z tą funkcją. W deklaracji klasy dodaj:

friend ostream& operator<<(ostream& os, const COsoba& u);

ostream, nie COsoba::ostream

0

gdy próbuję wrzucić to do klasy to wywala błędami :/

0

Pokaż kod lub zgłoś się na forum wróżbitów.

0

A więc COsoba.h :

#ifndef COsoba_H
#define COsoba_H

#include <string>

using namespace std;

class COsoba
{
	friend ostream& operator<<(ostream& os, const COsoba& u);
private:
	int nrID;
	string imie;
	string nazwisko;
	double stanKonta;
	static int nrIDWolny;
public:
	COsoba();
	COsoba(string, string, double);
	~COsoba();
	
	int getNr();
	string getImie();
	string getNazwisko();
	double getStanKonta();
	void wplata(double kwota);
	void setImie(string imie_s);
	void setNazwisko(string nazwisko_s);
	string toString();


};

#endif 

COsoba.cpp :

#include <iostream>
#include <sstream>
#include "COsoba.h"

using namespace std;

 int COsoba::nrIDWolny = 0;

COsoba::COsoba(){
	nrID = 0;
	imie = "imie";
	nazwisko = "nazwisko";
	stanKonta = 0.0;
	nrIDWolny++;

}

COsoba::COsoba(string imie_f, string nazwisko_f, double stanKonta_f) {
	nrID = nrIDWolny;
	imie = imie_f;
	nazwisko = nazwisko_f;
	stanKonta = stanKonta_f;
	nrIDWolny++;
};

COsoba::~COsoba() {
	cout << "Dane zostaly usuniete" << endl;
}


int COsoba::getNr(){
	return nrID;
}

string COsoba::getImie(){
	return imie;
};

string COsoba::getNazwisko(){
	return nazwisko;
}

double COsoba::getStanKonta(){
	return stanKonta;
}

void COsoba::wplata(double kwota){
	stanKonta = kwota;
}

void COsoba::setImie(string imie_s) {
	imie = imie_s;
};

void COsoba::setNazwisko(string nazwisko_s) {
	nazwisko = nazwisko_s;
};

string COsoba::toString() {
	stringstream ss, ss2;
	string str, str2, ret;
	ss << nrID;
	ss >> str;
	ss2 << stanKonta;
	ss2 >> str2;
	ret = str + " " + imie + " " + nazwisko + " " + str2;
	return ret;
};


 

CWycieczka.h :

#ifndef CWycieczka_H
#define CWycieczka_H

#include <string>
#include <vector>
#include "COsoba.h"

using namespace std;

class CWycieczka{
private:
	int nrID;
	string nazwa;
	double cena;
	vector <COsoba*> uczestnicy;
	static int nrIdWolny;
public:
	CWycieczka();
	CWycieczka(string, double);
	~CWycieczka();

	int getNrId();
	int getIleZapisanych();
	string toString();
	void dodajUczestnika(COsoba* uczestnik);
	void usunUczestnika(int nrKlienta);
	void pokazListeUczestnikow();


};

#endif
 

CWycieczka.cpp :

#include <iostream>
#include <vector>
#include <sstream>
#include "CWycieczka.h"

using namespace std;

int CWycieczka::nrIdWolny = 1;

CWycieczka::CWycieczka() {
	nazwa = "Wycieczka_bez_nazwy";
	cena = 0.0;
};

CWycieczka::CWycieczka(string nazwa_f, double cena_f) {
	nazwa = nazwa_f;
	cena = cena_f;
}

CWycieczka::~CWycieczka() {
	cout << "Uzyto destruktora na CWycieczka" << endl;
}

void CWycieczka::dodajUczestnika(COsoba* uczestnik){
	uczestnicy.push_back(uczestnik);
};

string CWycieczka::toString() {
	stringstream ss_c;
	string nazwa_s,ret;
	ss_c << cena;
	ss_c >> nazwa_s;
	ret = nazwa + " " + nazwa_s;
	return ret;
};

void CWycieczka::usunUczestnika(int nrKlienta){
	uczestnicy.erase(uczestnicy.begin() + nrKlienta);
};

ostream &operator << (ostream & os, const COsoba & u) {
	os << u.nrID << " " << u.imie << " " << u.nazwisko << " " << u.stanKonta;
	return os;
}

void CWycieczka::pokazListeUczestnikow() {

	for (int i = 0; i < uczestnicy.size(); i++)
	{
		cout << *(uczestnicy[i]) << endl;
	}
}
 

main.cpp :

#include <iostream>
#include <string>
#include "COsoba.h"
#include "CWycieczka.h"
#include "CBiuro.h"


int main()
{
	cout << "CYK CYK CYK" << endl;
	COsoba *os1 = new COsoba();
	cout << os1->toString() << endl;
	COsoba *os2 = new COsoba("Adam", "Nowak", 10.0);
	cout << os2->toString() << endl;
	os1->setImie("Piotr");
	os1->setNazwisko("Kosiorek");
	os2->wplata(200.0);
	cout << os1->toString() << endl;
	cout << os2->toString() << endl;
	CWycieczka *wyc1 = new CWycieczka();
	cout << wyc1->toString() << endl;
	CWycieczka *wyc2 = new CWycieczka("Panama", 100);
	cout << wyc2->toString() << endl;
	wyc2->dodajUczestnika(os2);
	wyc2->pokazListeUczestnikow();
	delete os1;
	delete os2;
	delete wyc1;
	delete wyc2;
	system("pause");
	return 0;
}
 

CBiuro jest nieskończone ale ono nie jest potrzebne do CWycieczka.

0

prostytutka! Co się tu wyprawia, do c****! Jutro z tego odpowiesz! Marek Gadzalski

0

Jedno z:
1.

ostream &operator<<(ostream & os,const COsoba &u) 
  {
   return os<<u.getNr()<<' '<<u.getImie()<<' '<<u.getNazwisko()<<' '<<u.getStanKonta();
  }
ostream &operator << (ostream &os,const COsoba &u) 
  {
   return os<<u.toString();
  }
0
ostream &operator << (ostream & os, const COsoba &u) {
	return os << u.toString();
} 

Nie działa. Wyrzuca

Błąd	1	error C2662: "std::string COsoba::toString(void)" : nie można konwertować wskaźnika "this" z "const COsoba" do "COsoba &"	e:\onedrive\dokumenty\study\programowanie obiektowe\prog1\prog1\cwycieczka.cpp	46	1	prog1
 
	3	IntelliSense: the object has type qualifiers that are not compatible with the member function
            object type is: const COsoba	e:\OneDrive\Dokumenty\study\Programowanie Obiektowe\prog1\prog1\CWycieczka.cpp	46	15	prog1
 
0

string COsoba::toString()const {...

0

Dzięki poszło. Jednak teraz mam :

Ostrzeżenie	1	warning C4018: "<": niezgodność typu ze znakiem/bez znaku	e:\onedrive\dokumenty\study\programowanie obiektowe\prog1\prog1\cbiuro.cpp	20	1	prog1
 
Ostrzeżenie	2	warning C4018: "<": niezgodność typu ze znakiem/bez znaku	e:\onedrive\dokumenty\study\programowanie obiektowe\prog1\prog1\cbiuro.cpp	50	1	prog1
 
Błąd	3	error LNK1168: cannot open E:\OneDrive\Dokumenty\study\Programowanie Obiektowe\prog1\Debug\prog1.exe for writing	E:\OneDrive\Dokumenty\study\Programowanie Obiektowe\prog1\prog1\LINK	prog1
 
0

I którego słowa nie rozumiesz w tych komunikatach?

0

Nie rozumiem dlaczego jest niezgodność typu ze znakiem. I nie wiem czemu nie może otworzyć prog1.exe do zapisu.

1

zagarnij normalne IDE i pracuj na angielskich compile errorach i warningach, wklejaj do googla i wkuwaj, jeżeli jeszcze chcesz być programistą

0
  1. Gdy porównujesz int z unsigned, np.
int x = 0; 
string s;
if (x < s.size())...
  1. Zobacz czy program ma prawo zapisu do tego miejsca. Czy nie jest tak, że potrzeba praw admina.
0
Krwawy Krawiec napisał(a):

I nie wiem czemu nie może otworzyć prog1.exe do zapisu.

Pewnie nie zamknąłeś program po poprzednim odpaleniu, wszak wkleiłeś to badziewie: system("pause");

0

Używam Visuala 2013... nie wiedziałem, że jest zły.
Ale ja porównuję i (licznik pętli) do rozmiaru vectora (czyli wydaje mi się, że dobrze ale wychodzi inaczej).
No tak zapewne OneDrive rozłączył się i nie mogę zapisać.

0

licznik powinien być typu size_t

0

Dobra dzięki już działa.
Czyli jakie środowisko polecacie? Dopiero zaczynam naukę i nienadążam za resztą grupy na zajęciach...

0

To znowu ja. Mam kolejny problem tym razem z CBiuro (które jeszcze nie skończone jest) :
CBiuro.h :

#include <vector>
#include "CWycieczka.h"
#include "COsoba.h"


class CBiuro {
private:
	vector <COsoba*> klienci;
	vector <CWycieczka*> wycieczki;
public:
	CBiuro();
	~CBiuro();
	void pokazKlientow();
	void dodajKlienta();
	void przyjmijWplate();
	void pokazWycieczki();
	void dodajWycieczke();
	void usunWycieczke(int nrWycieczki);
	void zapiszNaWycieczke();
	void wypiszZWycieczki(int nrKlienta, int nrWycieczki);
	void pokazUczestnikowWycieczki(int nrWycieczki);
	void menu();
};
 

CBiuro.cpp :

#include <iostream>
#include "CBiuro.h"
#include "COsoba.h"
#include "CWycieczka.h"

using namespace std;

CBiuro::CBiuro() {
	COsoba* klient;
	klienci.push_back(klient);
	CWycieczka* wycieczka;
	wycieczki.push_back(wycieczka);
}

CBiuro::~CBiuro() {
	cout << "CBiuro - odzyskiwanie pamieci" << endl;
}

void CBiuro::pokazKlientow() {
	for (size_t i = 0; i < klienci.size(); i++)
	{
		cout << klienci[i] << endl;
	}
}

void CBiuro::dodajKlienta() {
	COsoba* klient;
	int i = 0;
	cout << "Podaj id osoby: ";
	cin >> i;
	for (int j = 0; j < i; j++) {
		if (i=nrID) 
	}
	klienci.push_back(klient);
}

void CBiuro::przyjmijWplate() {
	cout << "Podaj kwote do wplacenia: ";
	double kwota_a;
	cin >> kwota_a;
	//wplata(kwota_a);
	cout << "POWODZENIE: wplata zostala przyjeta " << endl;

}

void CBiuro::pokazWycieczki() {
	for (size_t i = 0; i < wycieczki.size(); i++)
	{
		cout << wycieczki[i] << endl;
	}
}

void CBiuro::dodajWycieczke() {
	cout << "Wycieczka: ";
	string wycieczka_a;
	cin >> wycieczka_a;
	cout << "Cena: ";
	double cena_a;
	cin >> cena_a;
	CWycieczka* nowa_w = new CWycieczka(wycieczka_a, cena_a);
	wycieczki.push_back(nowa_w);
}

void CBiuro::usunWycieczke(int nrWycieczki) {
	wycieczki.erase(wycieczki.begin() + nrWycieczki);
}

void CBiuro::zapiszNaWycieczke(){
	//dodajUczestnika(klienci.); - zdjęcie ostatnio dodanego uczestnika i wrzucenie tutaj
	cout << "Zapisywanie na wycieczke ukonoczone pomyslnie! " << endl;
}

void CBiuro::wypiszZWycieczki(int nrKlienta, int nrWycieczki) {
	//usunUczestnika(nrKlienta);

}


void CBiuro::pokazUczestnikowWycieczki(int nrWycieczki) {
	//pokazListeUczestnikow()
}

void CBiuro::menu() {
	cout << "Co chcesz zrobić? " << endl;
	cout << "1.Pokaz klientów " << endl
		<< "2.Dodaj klienta " << endl
		<< "3.Dodac wplate " << endl
		<< "4.Pokazac wycieczki " << endl
		<< "5.Dodac wycieczke " << endl
		<< "6.Usunac wycieczke " << endl
		<< "7.Zapisac klienta na wycieczke " << endl
		<< "8.Wypisac klienta z wycieczki " << endl
		<< "9.Pokazac uczestnikow danj wycieczki " << endl;
}
 

Mam problem z nrID, który chce pobrać z klasy COsoba. Próbowałem dodać do klasy :

friend void dodajKlienta(); 

jednak to nie pomaga.

0

Po co friend, skoro masz getNr() w klasie COsoba?

for (int j = 0; j < i; j++) {
        if (i=nrID) 
}
klienci.push_back(klient);

Mało kodu, dużo bugów. Nawet nie wiem co próbujesz tutaj zrobić.

0

To powinno wyglądać tak moim zdaniem:

void CBiuro::dodajKlienta() {
	COsoba* klient;
	int i = 0;
	cout << "Podaj id osoby: ";
	cin >> i;
	for (int j = 0; j < i; j++) {
		if (i == nrID) {
			klienci.push_back(klient);
		}
	}
} 

Czyli podaną liczbę przyrównuję do nrID, jednak nie mam do niego dostępu

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