Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » <list> in Klasse

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
13.07.2006, 16:19 Uhr
~minala
Gast


Ich möchte mir gerne eine Klasse schreiben die eine Liste mit anderen Objekten hat. Also z.b. Kontaktbuch hat eine Liste mit Kontakten.

Wenn ich die Liste aber einbauen bricht der kompiler mit unverständlichen Meldungen ab:


C++:
#ifndef KONTAKTBUCH_H
#define KONTAKTBUCH_H
#include "Kontakt.h"
#include <list>

class Kontaktbuch
{
public:
    Kontaktbuch(void);
    ~Kontaktbuch(void);

private:
    char m_kbBesitzer[50];
    list<Kontakt*> Kontaktliste;
    
};
#endif



Zitat:

error C2143: syntax error : missing ';' before '<'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int


Die Klasse Kontakt existiert derzeit nur als leerer dummy, also gbit nur leeren Konstruktor/Destruktor....das kann aber nicht problem sein?!?

Wie kann ich nicht mehr kompilieren, wenn ich eine liste in meine klasse nehme?

Dieser Post wurde am 13.07.2006 um 20:19 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.07.2006, 16:40 Uhr
ao

(Operator)



C++:
class Kontaktbuch
{
public:
    Kontaktbuch(void);
    ~Kontaktbuch(void);

private:
    char m_kbBesitzer[50];
    std::list<Kontakt*> Kontaktliste;  // std::list<> statt list<>

};



Und warum machst du list<Kontakt*> und nicht list<Kontakt>?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.07.2006, 17:32 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Du nutzt hier eine Klasse aus der STL (Standard Template Library) deren Klassen alle unter ein und dem selben Namespace (Namensraum) stehen. dieser lautet std.wenn du alle Klassen aus diesem namespace auch im aktuellen Namensraum ansprechen willst, solltest du using nehmen.

C++:
using namespace std;


macht den Namensraum std auch lokal verfügbar, ohne std::. Wen du allerdings nur list lokal verfügbar machen willst, kannst du das mit

C++:
using std::list;


Ansonsten musst du den Namensraum immer mit angeben, damit der Kompiler weiß, woher er die Klasse nehmen soll. Kann ja sein, das mal jemand andres auch ne Klasse list codet und die verwendet. Mit namespaces kann man diese unterscheiden !


EDIT: Das sieht mir nach ANSI aus ->
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

Dieser Post wurde am 13.07.2006 um 17:32 Uhr von J-jayz-Z editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.07.2006, 19:11 Uhr
~minala
Gast



Zitat von J-jayz-Z:
Du nutzt hier eine Klasse aus der STL (Standard Template Library) deren Klassen alle unter ein und dem selben Namespace (Namensraum) stehen. dieser lautet std.wenn du alle Klassen aus diesem namespace auch im aktuellen Namensraum ansprechen willst, solltest du using nehmen.

C++:
using namespace std;


macht den Namensraum std auch lokal verfügbar, ohne std::. Wen du allerdings nur list lokal verfügbar machen willst, kannst du das mit

C++:
using std::list;


Ansonsten musst du den Namensraum immer mit angeben, damit der Kompiler weiß, woher er die Klasse nehmen soll. Kann ja sein, das mal jemand andres auch ne Klasse list codet und die verwendet. Mit namespaces kann man diese unterscheiden !


EDIT: Das sieht mir nach ANSI aus ->


Vielen Dank! Über diesen dämlichen stolperstein mit dem std:: falle ich so häufig, muss wir mirklich mal angewöhnen "using namespace std;" zu benutzen....

Danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.07.2006, 19:45 Uhr
stephanw
localhorst



Zitat:
Vielen Dank! Über diesen dämlichen stolperstein mit dem std:: falle ich so häufig, muss wir mirklich mal angewöhnen "using namespace std;" zu benutzen....


Für kleine Beispiele ist das in Ordnung. Sonst würde ich es mir an Deiner Stelle nicht angewöhnen, using-Deklarationen zu häufig zu benutzen. Auf gar keinen Fall in Header-Dateien, und auch sonst lieber sparsam. Du kannst wie J-jayz-Z es schreibt, auch einzelne Namen importieren oder eine Using-Deklaration nur innerhalb einer Funktion benutzen.
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.07.2006, 21:02 Uhr
ao

(Operator)



Zitat von stephanw:
Auf gar keinen Fall in Header-Dateien ...

... weil nämlich sonst jeder, der den Header benutzt, zwangsweise auch die using-Direktiven erbt. Auch, wenn er das gar nicht will.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.07.2006, 22:47 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


... oder zumindest nur in die klassendefinition rein, dann gilts nur für die klasse. Genauso wie using in funktionen, das geht auch, dann gilts nur für diese funktion.

Müsste das eigentlich auch so gehen?


C++:
#include <iostream>

namespace foo {
  void my() { std::cout << "foo" << std::endl; }
};

namespace bar {
  void my() { std::cout << "bar" << std::endl; }
};

int main()
{
  using namespace foo;

  my();
  
  {
    using namespace bar;
    my();
  }

  my();
}



gibt der dann da eigentlich


Code:
foo
bar
foo



aus?

oder


Code:
foo
bar
bar



?

rein theoretisch doch ersteres oder?


Bearbeitung:

ok das kompiliert gar nicht:

test.cpp: In function `int main()':
test.cpp:19: Fehler: Aufruf des überladenen »my()« ist nicht eindeutig
test.cpp:8: Anmerkung: Kandidaten sind: void bar::my()
test.cpp:4: Anmerkung: void foo::my()


--
class God : public ChuckNorris { };

Dieser Post wurde am 13.07.2006 um 22:48 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
14.07.2006, 08:44 Uhr
ao

(Operator)


@minala: Noch mal, warum speichert deine Liste nicht die Kontakt-Objekte, sondern die Zeiger darauf?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.07.2006, 15:08 Uhr
~minala
Gast



Zitat von ao:
@minala: Noch mal, warum speichert deine Liste nicht die Kontakt-Objekte, sondern die Zeiger darauf?

ao


ehm......nur so, hab mir einfach mal ein beispiel angesehen und das so übernommen.

wenn ich ein objekt in die liste aufnehmen, wird das dann in die liste kopiert so wie beim vector?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
19.07.2006, 11:38 Uhr
RHBaum




Zitat:

enn ich ein objekt in die liste aufnehmen, wird das dann in die liste kopiert so wie beim vector?


Ja

der clou ist nur drann, das die liste nich das blanke new nimmt sondern nen eigenen allokator, dar auf das massenweise erzeugen von objekten gleichen types spezialisiert ist, verwendet.

Soprich bei 1000 elementen wuerdest du bei
list<Kontakt*> 1000 mal new kontakt; oder sowas aufrufen
und du darfst deine liste ned beliebig loeschen sondern musst immer delete aufrufen

bei ner list<Kontakt> wuerdest du die allokation den allokator ueberlassen, musst aber dafuer bei jedem einfuegen ne kopie machen (CopyConstructor ! )
Das kann unter Umstanden sogar schneller sein ....
und du kannst die liste auch wegwerfen ohne probleme.

Bei sachen wo die kopie trivial ist, sollt man das unbedingt machen ...

Oftmals hat man den Fall, dass man nichttrivial zu kopierende objecte hat, die man mehrfach in unterschiedlichen containern referenzieren darf.

Da bietet sich dann sowas wie nen manager implementiert mit ner <list> an.
Also erstmal element in liste einfugen, dann hat man das ding da im container existieren, mit ner geeigneten operatorion sich nen zeiger auf das element in der liste holen, und den zeiger dann als referenz in den anderen containern verwenden.
liste eigenet sich deshalb, weil da die elemente nie umsortiert werden, egal ob man nen nachbarn loescht oder was auch immer .... laso die zeiger aufn element gueltig bleiben bis du die liste loeschst oder das element aus der liste rausholst

Hat den vorteil das keine losen mit new erzeugten objekte "rumfliegen" und man das delete nich mehr braucht. Man muss halt nur aufpassen, das die liste solange lebt wie auf die referenzen zugegriffen wird.

Ciao ..

Dieser Post wurde am 19.07.2006 um 11:41 Uhr von RHBaum editiert.
 
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: