Dziedziczenie , lista jednokierunkows

0

Witam wszystkich.

Mam napisać implementacje listy jednokierunkowej(Sala_kinowa).
Lista ma przechowywać wskaźniki na obiekty dziedziczące po klasie abstrakcyjnej Osoba tj.(student,doktor itp), okrojenie danych składowych jest dozwolone gdyż potem mam wyświetlić tylko ich imiona.
Mam napisać funkcje dodaj(Osoba & o).

Zaimplementowałem ją tak(na razie nie jest kompletna):

class Sala_kinowa
{
private:
	 int ilosc_elem;
public:
    friend struct elem;
    struct elem
	{
		elem() : data(NULL) , nast(NULL) {}
		Osoba * data;         
		elem * nast;
    } * head;

	Sala_kinowa()
        {
	     head = NULL;
	     ilosc_elem = 0;
        }

	void Sala_kinowa::Dodaj(const Osoba &data)
       {
	   if(ilosc_elem == 0)
	   {
		head = new elem;
		osobaToElem(head,data);
		++ilosc_elem;
	   }

           // dokonczyc gdy nie pusta
       }

	void osobaToElem(elem * const e , const Osoba & o)  // przypisuje wybrane dane z osoby do danych w elemencie
	{
		e->data->imie = o.imie;
		e->data->kolor_oczu = o.kolor_oczu;
		e->data->nazwisko = o.nazwisko;

	}

};
 class Osoba
{
protected:
    Kolor kolor_oczu;
	TString imie;
	TString nazwisko;
public:
	Osoba(void);
	Osoba(Kolor k ,TString i, TString n) : kolor_oczu(k),imie(i), nazwisko(n) { } 
	Osoba(Osoba& o);
	virtual ~Osoba(void) = 0;
	virtual void print() {}
	bool czyTenTyp(TString);

	Osoba & operator =(Osoba & o);
	operator TString();

	friend std::ostream& operator<<(std::ostream & os ,Osoba & O);
	friend std::istream& operator>>(std::istream & is ,Osoba & O);
	friend class Sala_kinowa;;

	

};

Problem jest tego typu ze kiedy tworze nowy element(elem) tworzy mi się wskaźnik na klasę abstrakcyjna Osoba lecz nie mogę stworzyć obiektu Osoba więc nie wywołują mi się konstruktory składowych elementów i program w funkcji osobaToElem się sypie bo nie ma mi gdzie przypisać danych.

Natomiast nie mogę w strukturze elem stworzyć obiektu Osoba bo jest abstrakcyjny.

Podsumowując nie wiem jak przygotować strukture element żeby była gotowa na przypisanie do składowej data danych obiektu dziedziczącego po Osobie. Jak sobie przygotować na nie miejsce.

Pozdrawiam i z góry dziękuje za pomoc

0

Bo to bez sensu co robisz. Powinieneś w ty przypadku jako argument dodaj() mieć wskaźnik który zwyczajnie przypiszesz do elem -> data

1

Powinno być:

elem() : data(NULL) , nast(NULL), osoba(new Osoba())
 

Wskaźnik na osobę pokazywał na nulla wcześniej dlatego się program sypał

1

Bezsens nie z tej ziemi:

viruss3000 napisał(a):
class Sala_kinowa
{
private:
	 int ilosc_elem; // Czyżby przewidujesz że będzie np minus dziesięć elementów na liście?
public:
    friend struct elem; // A masz w tym elem coś prywatnego?
    struct elem
	{
		Osoba * data; // Po kiego ci dodatkowy wskaźnik niech będzie od razu obiekt: Osoba data;
		elem * nast;
		elem() : data(NULL) , nast(NULL) {} // odpowiednio to: elem(const Osoba &data):data(data) ,nast(0) {}, NULL w C++-  WTF
    } * head; // a może tak dołożysz jeszcze *tail, aby za każdym razem nie szukać gdzie jest koniec listy? head - publiczny - to samobój.

	Sala_kinowa() // a nie prościej na liście inicjalizacyjnej? Sala_kinowa():ilosc_elem(0),head(0),tail(0) {}
//        {
//	     head = NULL;
//	     ilosc_elem = 0;
//        }

	void Sala_kinowa::Dodaj(const Osoba &data)
       {
           tail=(tail?tail->next:head)=new elem(data); // I więcej nić nie potrzebujesz !
           ++ilosc_elem; // no oprócz tego

	   //if(ilosc_elem == 0)                      // to wszystko szajs jeżeli wyżej zrobisz po ludzku, a użyć if(!ilosc_elem) mniej czytelne?
	   //{
	//	head = new elem;                  // to wszystko szajs jeżeli wyżej zrobisz po ludzku
	//	osobaToElem(head,data);        // j.w.
	//	++ilosc_elem;                       // j.w. oraz Tylko jeżeli było 0 elementów
	//   }

           // dokonczyc gdy nie pusta
       }

//	void osobaToElem(elem * const e , const Osoba & o)   // Cała metoda to łata do bzdur wyżej
//	{
//		e->data->imie = o.imie;                                 // j.w.
//		e->data->kolor_oczu = o.kolor_oczu;                // j.w.
//		e->data->nazwisko = o.nazwisko;                    // j.w.
//
//	}

};
0

Dziękuje za pouczającą krytyke. Ale problemem jest to że klasa Osoba jest abstrakcyjna i nie mogę tworzyć takich obiektów

0
viruss3000 napisał(a):

Dziękuje za pouczającą krytyke. Ale problemem jest to że klasa Osoba jest abstrakcyjna i nie mogę tworzyć takich obiektów

A ten dziwoląg:
void osobaToElem(elem * const e , const Osoba & o)
to jak miałeś rozwiązać, ma przepisywać do abstrakcyjnej części ?
Nie możesz niczego kopiować, tylko podpinać zewnętrzne obiekty.
Więc zostaje tylko deklaracja po staremu:
Osoba *data;
oraz trochę inaczej konstruktor dla elem:
elem(Osoba *data):data(data) ,nast(0) {}

0

Usunąłem abstrakcyjność osoby. Dzięki jeszcze raz za pomoc

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