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

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!

0

Dziedziczenie i polimorfizm.

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

0

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

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() );

?

0

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

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 }
}
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( ? );

0

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

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

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).

0

Dzięki wszystkim za pomoc.. działa, tak jak miało:)

PS. Nie mogłem sprawdzić, bo byłem w pracy..

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