Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Listen aus Listen?????

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
04.11.2008, 11:32 Uhr
dafduf



Huhu zusammen,

da bin ich mal wieder mit nem Problem und hoffe auf Eure Hilfe:

Ich habe zwei Klassen: Klasse1 und Klasse2.


C++:
class MeineKlasse1
{
public:
    MeineKlasse1();
    virtual ~MeineKlasse1();
};

class MeineKlasse2
{
public:
    MeineKlasse2();
    virtual ~MeineKlasse2();
};



Möchte jeweils eine Liste erstellen mit Objekten aus den Klassen:
Liste1 aus Objekten der Klasse1
Liste2 aus Objekten der Klasse2


C++:
    std::list<MeineKlasse1*> meine_liste1;
    std::list<MeineKlasse2*> meine_liste2;



Das füllen der Listen ist auch kein Problem.

Nun möchte ich aber gerne eine Ober-Liste haben, die die beiden Listen beinhaltet und dachte das ginge mit:


C++:
      std::list<std::list*> meine_ober_liste;



Leider haut das nicht hin und bekomme angezeigt, dass ein Typ erwartet wird , aber eine Liste da steht.
Wie genau kann man das Realisieren, oder geht das vielleicht gar nicht?
Falls es geht, wie fülle ich die Ober-Liste, auch mit pushback?

Vielen Dank schonmal für Eure Hilfe.

Grüße, und noch einen schönen Dienstag Mittag.

Omar.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.11.2008, 12:16 Uhr
ao

(Operator)


Das Problem ist, dass std::list noch kein Datentyp ist. Erst durch die Template-Parameter wird ein Typ draus.

Nächstes Problem ist, dass deine Listen von verschiedenen Basistypen sind (MeineKlasse1 und MeineKlasse2), d.h. auch die Listen selbst haben verschiedene Typen. Zum Listen-Paradigma gehört, dass eine Liste nur Elemente gleichen Typs enthalten kann. Deine Ober-Liste würde dagegen verstoßen.

Wozu brauchst du das? Wenn die Klassen verschieden sind, gibt es keinen Grund, sie im gleichen Container zu halten. Im Gegenteil, es gibt gute Gründe, sie zu trennen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.11.2008, 12:46 Uhr
dafduf



Hallo ao,

vielen Dank erstmal für die schnelle Antwort.
Das Ziel ist später die Liste durch ein Programm zu schicken. Ich möchte aber nicht alle Listen mit den verschiedenen Klassen einzeln in den Funktionen als Übergabeparameter einfügen, sondern, wollte nur eine Liste geben, die Ober-Liste, und die Funktionen selber entscheiden dann welche Unter-Liste sie genau haben wollen.Die Funktionen sind wiederum innerhalb von Klassen definiert, wobei es eine virtuelle Funktion gibt als Maske. Hoffe ich konnte mein Vorhaben ein wenig verdeutlichen.

Naja und somit hatte ich gehofft, alle Listen in eine Oberliste zu schmeissen.

Hmmm....jetzt bin ich n bissi ratlos was ich da machen soll....hatte gehofft dass es irgendwie gehen würde....

Hat vielleicht irgend jemand ne andere Lösung, wie ich alle Listen zusammenwursteln kann und den gesamten Listenknäuel durch die Gegend tragen kann??
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.11.2008, 12:58 Uhr
ao

(Operator)



Zitat von dafduf:

Das Ziel ist später die Liste durch ein Programm zu schicken. Ich möchte aber nicht alle Listen mit den verschiedenen Klassen einzeln in den Funktionen als Übergabeparameter einfügen, sondern, wollte nur eine Liste geben, die Ober-Liste, und die Funktionen selber entscheiden dann welche Unter-Liste sie genau haben wollen.

Woran sollen sie denn die gewünschte Liste erkennen? Die in der Oberliste enthaltenen Elemente sehen alle gleich aus.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
04.11.2008, 13:12 Uhr
dafduf



Hmmm ne gute Frage, darüber hab ich noch gar nicht nachgedacht.

Kann man denn die einzelnen Listen irgendwie erkennen, z.b. am Listenname List1, List2, etc.?

Ansonsten müsst ich ne Art Parameter als Marker in die Klassen selber hinzunehmen und dann Abfragen, was für einen Status der Marker hat und somit dann feststellen in welcher Klasse ich bin, aber dann kann ich eigentlich auch alle Objekte aller Klassen in die selbe Liste setzen und vorher einfach eine Liste aus einer Basis-Klasse der anderen Klassen erzeugen.

Hmmm...irgendwie hatte ich mir das ganz anders vorgestellt.
naja ich denke ich mache das dann mit einer Liste und ner basisklasse und leite dann die anderen Klassen von der Basisklasse ab und speichere sie dann in die Liste nacheinander ab.

Falls ihr noch einen anderen Vorschlag habt, wie man sowas lösen könnte, wäre klasse.
Ich wollte es gerne mit Listen lösen, da sie beim abarbeiten sehr schnell sind.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
04.11.2008, 13:52 Uhr
ao

(Operator)


Was du da vorhast, ist folgendes: Äpfel, Birnen und Pflaumen in einen Eimer schütten und als "Obst" durch die Gegend reichen. Das ist NUR DANN sinnvoll, wenn der Empfänger es auch als Obst behandelt (alles in einen Topf, Zucker drauf, Kompott kochen).

Wenn die Pflaumen vorher entsteint werden müssen, ist es besser, die Sorten getrennt zu halten als jedes Stück noch mal zu untersuchen: Bist du eine Pflaume? Wenn ja, dann Stein rausholen.

Eine Basisklasse sollte man nur einführen, wenn es wirklich Polymorphie zwischen den Objekten gibt, und nicht nur deshalb, um sie in denselben Container stopfen zu können. Verschiedene Dinge GEHÖREN NICHT in denselben Sack. Sonst machst du am Ende "class Thing" und leitest davon die ganze Welt ab.

Bessere Vorschläge? Dazu müsste man wissen, was das eigentlich werden soll.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
04.11.2008, 13:58 Uhr
dafduf



ich brauch nochmal bitte gaaanz dringend eure hilfe, irgendwie hänge ich grad am listenproblem:
folgender code:


C++:
#include <iostream>
#include <string>
#include <list>

class MeineBasisKlasse
{
public:
    MeineBasisKlasse();
    int listenID;
    virtual ~MeineBasisKlasse();    
};

class MeineKlasse1:public MeineBasisKlasse
{
private:
    int name;
public:
    MeineKlasse1(int);
    void set_name(int);
    int get_name(void);
    virtual ~MeineKlasse1();
};

class MeineKlasse2:public MeineBasisKlasse
{
private:
    int zahl;
public:
    MeineKlasse2(int);
    void set_zahl(int);
    int get_zahl(void);
    virtual ~MeineKlasse2();
};

typedef std::list<MeineBasisKlasse*> List;

int main (void)
{
    List meine_liste;
    std::list<MeineBasisKlasse*>::iterator mein_listen_iterator;
    int j;

    for (int i=1;i<4;i++) meine_liste.push_back(new MeineKlasse1(1));
    for (int i=1;i<6;i++) meine_liste.push_back(new MeineKlasse2(2));

    j=1;
    for (mein_listen_iterator=meine_liste.begin();mein_listen_iterator!=meine_liste.end();mein_listen_iterator++)
    {
        if ((*mein_listen_iterator)->listenID==1) (*mein_listen_iterator)->set_name(j);
        if ((*mein_listen_iterator)->listenID==2) (*mein_listen_iterator)->set_zahl(100-j);
        j++;
    }
    while (!meine_liste.empty()) meine_liste.pop_back();
    return 0;
}

MeineBasisKlasse::MeineBasisKlasse(){}
MeineBasisKlasse::~MeineBasisKlasse(){}    

MeineKlasse1::MeineKlasse1(int m_listenID){listenID=m_listenID;}
void MeineKlasse1::set_name(int m_name){name=m_name;}
int MeineKlasse1::get_name(void){return name;}
MeineKlasse1::~MeineKlasse1(){}

MeineKlasse2::MeineKlasse2(int m_listenID){listenID=m_listenID;}
void MeineKlasse2::set_zahl(int m_zahl){zahl=m_zahl;}
int MeineKlasse2::get_zahl(void){return zahl;}
MeineKlasse2::~MeineKlasse2(){}



Mir ist nicht klar, wieso der Iterator nicht funzt. Ich bekomme den Fehler in der for Schleife, wo ich auf die set-Funktionen der unterschiedlichen Klassen zugreifen möchte, dass die set-funktionen nicht bekannt sind.
Ich hab es nun wie vorher beschrieben so gemacht, dass ich mir eine Liste aus einer basisklasse erzeugt habe und dann beim auffüllen der liste bestimme von welcher Klasse das zu erzeugende Objekt sein soll. Aber es ist wichtig, dass ich dementsprechend dann auch auf die Klassenspezifischen Funktionen zugreifen kann!!

Bitte Bitte helft mir nochmal. Dankeeee.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
04.11.2008, 14:38 Uhr
ao

(Operator)



Zitat von dafduf:
Ich bekomme den Fehler in der for Schleife, wo ich auf die set-Funktionen der unterschiedlichen Klassen zugreifen möchte, dass die set-funktionen nicht bekannt sind.

Weil die Funktionen in der Basisklasse nicht definiert sind. Mit dem Basis-Iterator kannst du nur aufs Basis-Interface zugreifen.

Die Setter und Getter sind nur in den abgeleiteten Klassen definiert, aber die Basisklasse weiß natürlich nicht, wer alles von ihr erbt.

Definiere Setter und Getter in der Basisklasse als virtual-Methoden (oder als pure-virtual-Methoden) und überschreib sie in den abgeleiteten Klassen mit dem gewünschten Verhalten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
04.11.2008, 14:43 Uhr
dafduf



Danke Dir für Deine Hilfe, leider geht das nicht mit den virtuellen Methoden, da in meinem richtigen Programm mehrere Unterklassen sind, die schon einige spezifische Funktionen neben den allgemeinen Funktionen der Basisklasse besitzen.Sonst wäre die Basisklasse überflutet mit virtuellen Methoden, die vielleicht viele Unterklassen gar nicht haben. Habs in diesem Beispiel nun anders gelöst mit nem dynamic_cast. Ich frage vorher nach der listenID und caste dann entsprechend den Iterator in die passende Klasse und kann so dann meine Funktion verwenden. Hoffe nur dass das später auch in dem aufwendigeren Programm hinhaut. Vielen Dank nochmal für die Hilfen und Denkanstösse.
Dieser Post wurde am 04.11.2008 um 14:44 Uhr von dafduf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
04.11.2008, 15:11 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von dafduf:
Sonst wäre die Basisklasse überflutet mit virtuellen Methoden, die vielleicht viele Unterklassen gar nicht haben.

Dann macht es auch keinen Sinn diese Klassen von der selben Basisklasse abzuleiten. Wie ao schon mehrmals gesagt hat solltest du da dein Design überdenken.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: