Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Klasse von Template ableiten

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 <
000
11.10.2002, 15:47 Uhr
MarcDuerner



Hi,
Ich möchte gerne eine eigene StringList Klasse erstellen und diese von einer STL list ableiten.
Wie macht man das denn genau?

das geht wohl nicht:

#include <list>
#include <string>

class StringList : public list<string>
{
}


Grüße,
Marc
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
11.10.2002, 15:59 Uhr
virtual
Sexiest Bit alive
(Operator)


Dein Beispiel funktioniert nicht, weil du vor list und string jeweils das std:: vergessen hast (Achtung, noch immer falscher Code, siehe Anmerkung unten):

C++:
class StringList: std::list<std::string>
{
...
}


ABer: das Ableiten von STL Containern ist einer der größten Fehler, die man begehen kann, weil keine dieser Klassen/Templates einen virtuellen Destructor besitzt. Es gilt ohne Ausnahme folgende Regel: Leite nie von Klassen der STL eigene Klassen ab.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
11.10.2002, 16:08 Uhr
MarcDuerner



Gibt es denn alternativen, ohne ganz von null anfangen zu müssen um eine StringList zu implementieren?


Gruß,
Marc
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.10.2002, 16:24 Uhr
virtual
Sexiest Bit alive
(Operator)


Eine allg. Liste von strings ist eben list<string>. Dh wenn Du wirklich einfach nur eine Liste von Strings hast, solltest Du eben dieses Ding verwenden, ggf durch ein typedef was kürzer gestalten:

C++:
typedef std::list<std::string> string_list;

...
string_list meineListeVonStrings;


Die Tatsache, dass Du von list<string> etwas ableiten willst heisst für mich, dass Du sie irgendwie Spezialisieren möchtest. Wie Du das genau angehen willst, hängt von der Problemstellung ab. Gängige Praxis ist, die Liste zum Member der ´Klasse zu machen und nur die wirklich interessanten Methoden ins Interface zu übernehmen:

C++:
class MeineKlasse
{
    std::list<std::string> liste;
public:
    // Wirklich wichtige Operationen arbeiten nun mit dem member liste
    // Ein direkter Zugriff auf die Liste von Aussen ist unterbunden
};


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.10.2002, 22:18 Uhr
MarcDuerner



Wenn ich es so mache wie du sagst (zweites Bespiel "class MeineKlasse"), kann ich dann ein MeineKlasse.erase() machen oder muss ich erase() neu für MeineKlasse implementieren?

Marc
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.10.2002, 09:18 Uhr
void*
Generic Pointer
(Operator)


Hallo!

Du musst Dein eigenes erase() schreiben, aber das ist trivial:


C++:
std::list<std::string> iterator MeineKlasse::erase(void)
{
  return(liste.erase());
}



Das mit dem Rückgabewert kannst Du auch unterschiedlich handhaben.

Gruß
void*
--
Gruß
void*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: