[C++] Lista obiektów o różnych typach

Odpowiedz Nowy wątek
Karol
2010-12-28 13:30
Karol
0

Cześć,
Jaki jest najlepszy sposób na napisanie listy za pomocą biblioteki <list>, wielu obiektów różnego typu tzn:

class KlasaA{
int a;
list<mojtyp> b;

KlasaA(int aa){ a = aa;}
void Wypisz(){ metoda wypysiwania }
}

class KlasaB{
int b;
list<klasaa> c;

KlasaB(int aa){ b = aa;}
void Wypisz(){ ZUPEŁNIE INNA metoda wypysiwania, nie ma nic wspólnego z klasą A }
}

itd... wiele różnych klas.

I chciałbym zrobić listę, ich obiektów.. Z czego w takim przypadku najlepiej skorzystać?
Tak żebym mógł wszystko przelecieć w pętli, i wywoływać jedynie metodę wypisz..

z góry dzięki za pomoc!

Pozostało 580 znaków

2010-12-28 13:51
Moderator

Rejestracja: 12 lat temu

Ostatnio: 3 godziny temu

0

Dziedziczenie i polimorfizm.


Pozostało 580 znaków

Karol
2010-12-28 13:56
Karol
0

Tego sie obawiałem:/
A możesz mniej więcej to napisać na przykładzie tych dwóch klas?
z góry dzięki

Pozostało 580 znaków

Karol
2010-12-28 13:58
Karol
0

Bo właśnie te klasy są zupełnie niezależne, nic po sobie nie dziedziczą.

Pozostało 580 znaków

Karol
2010-12-28 14:31
Karol
0

Czy ma to wyglądać mniej więcej tak:

class obiekt{
int id;
}

class ksiazka : public obiekt
{
}

class samochod : public obiekt
{
}

class osoba : public obiekt
{
}

class radio : public obiekt
{
}

list<obiekt*> lista_obiektow;

lista_obiektow.push_back( new samochod() );
lista_obiektow.push_back( new samochod() );
lista_obiektow.push_back( new osoba() );
lista_obiektow.push_back( new radio() );

?

Pozostało 580 znaków

2010-12-28 14:38
Moderator

Rejestracja: 16 lat temu

Ostatnio: 29 minut temu

0

Nie. Klasa obiekt powinna zawierać tą metodę (wirtualną!) którą mają mieć wszystkie pochodne klasy.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

2010-12-28 14:40
Moderator

Rejestracja: 12 lat temu

Ostatnio: 3 godziny temu

0

Na twoim przykładzie:

class IKlasa {
public:
   virtual ~IKlasa() {}
   virtual void Wypisz() = 0;
}

class KlasaA : public IKlasa {
  int a;
  list<MojTyp> b;

  KlasaA(int aa){ a = aa;}
  void Wypisz(){ metoda wypysiwania }
}

class KlasaB : public IKlasa {
  int b;
  list<KlasaA> c;

  KlasaB(int aa){ b = aa;}
  void Wypisz(){ ZUPEŁNIE INNA metoda wypysiwania, nie ma nic wspólnego z klasą A }
}

edytowany 1x, ostatnio: hauleth, 2010-12-28 14:40

Pozostało 580 znaków

Karol
2010-12-28 14:53
Karol
0

Dzięki wielkie
ale nie do końca rozumiem jak miałbym teraz zrobić listę, w której znajdowałyby się obiekty klasy A oraz B.

list< ? > lista_obiektow;
lista_obiektow.push_back( ? );

Pozostało 580 znaków

2010-12-28 14:54
Moderator

Rejestracja: 16 lat temu

Ostatnio: 29 minut temu

0

Albo lista referencji albo wskaźników na typ bazowy.


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

Karol
2010-12-28 15:16
Karol
0

czyli:

list<IKlasa*> lista_obiektow;

ale:

lista_obiektow.push_back( new IKlasa() );

czy

lista_obiektow.push_back( new KlasaA() );
lista_obiektow.push_back( new KlasaA() );
lista_obiektow.push_back( new KlasaB() );

W drugim przypadku: Zostanie wtedy wykonany odpowiedni konstruktor?
A w momencie odwołania się do kolejnego elementu listy, iteratora - będę miał do dostępu obiekt konkretnej klasy (A lub B) ? Tak?

Sorry za takie pytania, ale niestety nie mam teraz jak sprawdzić, a potrzebuje pilnie tych informacji.

z góry dzięki

Pozostało 580 znaków

2010-12-28 15:27
Moderator

Rejestracja: 16 lat temu

Ostatnio: 29 minut temu

0

Nie masz jak sprawdzić? Ukradli ci komputer? Żal.pl
A pomyśleć nie potrafisz? Oczywiście że masz tworzyc tam obiekty KLAS POCHODNYCH. Jak inaczej w ogóle być chciał miec tam te obiekty? Nie, nie będziesz mial dostępu do obiektu odpowiedniej klasy. Będziesz miał dostęp do metod z interfejsu które to metody będą wywoływane w odpowiedniej wersji (tej pochodzącej z klasy typu pochodnego).


Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...

Pozostało 580 znaków

Odpowiedz

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