Baza danych osób w liście obudowana w klasy.

0

Witam

Ćwiczę ostatnio programowanie obiektowe w c++ i zrobiłem bazę danych jakichś ludzi przechowywaną w liście dwukierunkowej. Program oczywiście się kompiluje, ale nie mam pojęcia jak dorobić do nie destruktory, mam też kilka wątpliwości co do składni, które umieściłem w komentarzach w kodzie. Ogólnie mam wrażenie, że kod jest jakiś "nieelegancki" czekam na wszelkie sugestie.

#include <iostream>
#include <string>
using namespace std;

//tutaj muszę zadeklarować klasę osoba, by klasa lista mogla tworzyc zmienne tego typu,
//jesli odwroce kolejnosc deklaracji to klasa osoba nie bedzie wiedziala co ma dziedziczyc
class osoba;


class lista {
	protected:
		osoba * nastepnaOsoba;
		osoba * poprzedniaOsoba;
		lista(osoba * a, osoba * b):
			poprzedniaOsoba(a), nastepnaOsoba(b) {}
		~lista() {
			delete poprzedniaOsoba;
			delete nastepnaOsoba;
		}
};

class osoba : protected lista {
		string imie;
		string nazwisko;
	public:
		osoba(string * t, osoba * a = NULL, osoba * b = NULL):
			imie(t[0]), nazwisko(t[1]), lista(a, b) {}
		osoba * nowaOsoba(string *);
		// przy probie usuniecia tego wskaznika wyskakuje 
		//31 [Error] type '<unresolved overloaded function type>' argument given to 'delete', expected pointer
		~osoba() {
			osoba * p = this;
			while (p != NULL) {
				cout << p->imie << ' ' << p->nazwisko << endl;
				p = p->poprzedniaOsoba;
			}
			delete p;
		}
};

osoba * osoba::nowaOsoba(string * t) {
	osoba * o = new osoba(t, this, NULL);
	this->nastepnaOsoba = o;
	return o;
}

void dane(string *t) {
	string a, b;
	cout << "Wpisz imie i nazwisko" << endl;
	cin >> a;
	cin >> b;
	t[0] = a;
	t[1] = b;
}

int main() {
	string temp[2];
	dane(temp);
	osoba * o = new osoba(temp);
	char c;
	cout << "Czy chcesz dodac nastepna osobe (t/n)" << endl;
	cin >> c;
	// by petla zadzialala musze jeszcze raz przepisac to samo, mozna to jakos ominac?
	while (c == 't') {
		dane(temp);
		o = o->nowaOsoba(temp);
		cout << "Czy chcesz dodac nastepna osobe (t/n)" << endl;
		cin >> c;
	}
	delete o;
	return 0;
} 

Z góry dziękuje za pomoc

Pozdrawiam dagi12

1

Ta klasa Osoba nie powinna zajmować się tym, który element w liście będzie następny/poprzedni. zrób sobie do tego osobną klasę/strukturę np. węzeł/element. Taka lista nie jest uniwersalna i możesz w niej trzymać tylko obiekty danego typu. Jak będziesz się uczyć to dojdziesz do tego, że powinieneś to zrobić na szablonach a najlepiej skorzystać z http://www.cplusplus.com/reference/list/list/ . niżej zamieszczam Ci przykład jak ja bym to próbowała zrobić.

#include <iostream>
#include <string>

class Osoba {
private:
	std::string imie;
	std::string nazwisko;
public:
	Osoba() : imie(""), nazwisko("") {}
	Osoba(std::string imie,std::string nazwisko) :
		imie(imie), nazwisko(nazwisko) {}
	std::string toString() {
		return imie + " " + nazwisko;
	}
};

class ListaOsob {
private:
	typedef struct Element {
		Element *nastepny;
		Element *poprzedni;
		Osoba osoba;
	} Element;
	Element *pierwszy;
	Element *ostatni;
public:
	ListaOsob() : pierwszy(NULL), ostatni(NULL) {}
	void push_back(Osoba o) {
		Element *e = new Element;
		e->osoba = o;
		e->nastepny = NULL;
		e->poprzedni = ostatni;
		if(!pierwszy && !ostatni)
			pierwszy = e;
		else
			ostatni->nastepny = e;
		ostatni = e;
	}
	~ListaOsob() {
		Element *ns, *s = pierwszy;
		while(s) {
			ns = s->nastepny;
			delete s;
			s = ns;
		}
	}
};

Osoba getOsobaFromUser() {
	std::string imie, nazwisko;
	std::cout << "Wpisz:<imie nazwisko>" << std::endl;
	std::cin >> imie >> nazwisko;
	return Osoba(imie,nazwisko);
}

int main(void) {
	ListaOsob lista;
	char c = 't';
	while(c=='t') {
		lista.push_back(getOsobaFromUser());
		std::cout << "Czy chcesz dodac nastepna osobe (t/n)" << std::endl;
		std::cin >> c;
	}
	return 0;
}

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