Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit map aus STL

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
09.06.2005, 14:11 Uhr
~HansH
Gast


Hallo zusammen,

Ich möchte gern eine map nutzen. Als key ein int und als value eine selbst rstellte abstracte klasse mit 2 unterklassen:

map <int, Konto> konten;

Doch wenn ich nun ein neuen eintrag in der map anlegen möchte:

...
konten[knummer]=k;

bekomme ich folgende Fehlermeldung bei Bloodshed dev c++:


Ausgabe:

no match for 'operator=' in '(((std::map<int, Bank::Konto, std::less<int>, std::allocator<std::pair<const int, Bank::Konto> > >*)((Bank::MyBank*)this)) + 4u)->std::map<_Key, _Tp, _Compare, _Alloc>::operator[] [with _Key = int, _Tp = Bank::Konto, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, Bank::Konto> >](((const int&)((const int*)(&knummer)))) = k'



Drüber hinaus würde ich gern wissen wie ich funktionen von den in map gespeicherten objekten aufrufen kann. Würde das so gehn?:

konten[knummer]->funktion();

Danke euch

mod edit: Benutze CODE Tags selber

Dieser Post wurde am 14.06.2005 um 10:44 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.06.2005, 14:21 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


guck mal auf www.sgi.com/tech/stl da findest du ne doku zur stl mit beispielen... in deinem fall

www.sgi.com/tech/stl/Map.html
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.06.2005, 14:23 Uhr
~HansH
Gast



Zitat von Windalf:
guck mal auf www.sgi.com/tech/stl da findest du ne doku zur stl mit beispielen... in deinem fall

www.sgi.com/tech/stl/Map.html




Hallo,

Danke für deine Antwort. Dieses Dokument ist mir schon bekannt. Leider finde ich trotzdem keine Antwort auf mein Problem in diesem Dokument habe ich etwas übersehen?

Dieser Post wurde am 09.06.2005 um 14:34 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.06.2005, 14:58 Uhr
doppler




Zitat von ~HansH:

Drüber hinaus würde ich gern wissen wie ich funktionen von den in map gespeicherten objekten aufrufen kann. Würde das so gehn?:

C++:
konten[knummer]->funktion();





In der STL ist konten[knummer] kein Zeiger auf ein Konto, sondern eine Referenz. Also eher

C++:
konten[knummer].funktion();



Das könnte auch der Fehler bei

C++:
konten[knummer]=k;


sein. Wenn k ein Zeiger auf ein Konto ist, funktioniert das nicht.

Wenn das nicht hilft, solltest du vielleicht etwas mehr von deinem Code posten.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.06.2005, 15:10 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von ~HansH:
Hallo zusammen,
Ich möchte gern eine map nutzen. Als key ein int und als value eine selbst rstellte abstracte klasse mit 2 unterklassen:


Erstmal die schlechte nachricht:
Wenn konto die abstracte Basisklasse ist: geht so nicht, vergiß es: ein C++ Kontainer kann nur Objekte exact gleichen Typs, welche instantiierbar sein müssen aufnehmen. Du kannst also keine Map bauen, wo direkt die Unterklassen drin sind.

Dann die Gute:
Nun bist Du ja nicht der erste, der vor einem solchen Problem steht. Im allg. behilft man sich damit, nur Pointer - oder besser: pointer ähnliche Dinge - in den Cointainer zu tun, also etwa
map<int, konto*>.
Das Problem hier ist dann aber, daß man die Zeiger auch immer schön brav freigeben muss. Um das wiederum zu umgehen benutzt man smart Pointer (einen solchen findest Du acuh in der FAQ):


C++:
map<int, smart_ptr<konto> > kmap;

kmap[4711] = new konto_klasse1(...);
kmap[4712] =  new konto_klasse2(...);
...
kmap[4711]->method();


--
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
005
14.06.2005, 08:22 Uhr
~HansH
Gast


Danke. Habe es bisher nur mit nem Zeiger hinbekommen. Das mit dem smart pointer werde ich testen. Vielen Dank.

Anderes problem. Die 2 unterklassen der Klasse Konto besitzen als Attribut wwieder eine Klasse, die wiederrum als Attribut eine Klasse besitzt (ALso Teil<-> Ganze beziehung).
Nun möchte ich aber über eine Funktion alle Informationen dieser ausgeben.
Bisher nutzte ich einen iterator für die map. Den key lässt sich problemlos ausgeben mit dem interator nur leider weiß ich nciht wie ich an die restlichen daten kommen kann.

Nochmal als übersicht

konto
/ \
kontotyp1 Kontotyp2
| |
Kunde Kunde
| |
Adresse Adresse

Die Attribute der einzelnen klassen sind private und lassen sich über get-Funktionen abrufen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
14.06.2005, 09:33 Uhr
virtual
Sexiest Bit alive
(Operator)


Mehr Code wäre gut.
--
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
007
14.06.2005, 09:37 Uhr
Th



Wenn du einen iterator bzw const_iterator "it" hast, kannst du mit (*it).Methode() bzw. it->Methode() auf die in der Map eingetragenen Klasse zugreifen. Bei einem Zeiger (wie z.B. Konten*) muß man noch eine weitere Dereferenzierung durchführen, also (*it)->Methode().
Ansonsten poste mal ein wenig Code.

Edit: Mist, schon wieder zu langsam ;)

Dieser Post wurde am 14.06.2005 um 09:37 Uhr von Th editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
14.06.2005, 10:17 Uhr
~HansH
Gast



C++:
class Bank
   {
   private:
      std::map<int,Konto*> konten;
      static MyBank* bank;
      MyBank();
   public:
      ...
      Girokonto& createGirokonto(int knummer,const Kunde& k);
      Sparkonto& createSparkonto(int knummer,const Kunde& k);
      void ueberweisen(Konto& k1, Konto& k2, int betragInCent) throw (BankException);
      ...
      void printall();
   };
}

class Konto
   {
   private:
      const unsigned int nummer;
      const Kunde* k;
   protected:
      int saldoInCent;
   public:
      ...
      int getSaldo() const;
      unsigned int getKontonummer() const;
      ...
   };

class Kunde
   {
   private:
      static unsigned int anz;
      Adresse adresse;
      char name[80];
   public:
      ...
      const char* getName() const;
      ...
   };

class Adresse
   {
   private:
      const char* strasse;
      const char* ort;
      void setStrasse(const char* aStrasse);
      void setOrt(const char* aOrt);
   public:
     ...
      const char* getStrasse() const;
      const char* getOrt() const;
   };



ich hoffe das reicht. Wenn nicht einfach nochmal schreien Danke schonmal
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
14.06.2005, 14:06 Uhr
doppler



Wenn man nur die Deklarationen sieht, ist es nicht so einfach, herauszufinden wo es Probleme gibt. Auf jeden Fall sollte aber die Zeile

C++:
MyBank();


in der Klasse Bank einen Fehler produzieren, da nur Konstruktoren ohne Rückgabetyp deklariert werden können.

Abgesehen davon zeigt, soweit ich weiß, ein Iterator bei einer map auf ein pair, also in deinem Fall auf ein pair<int,Konto*>. Wenn du einen

C++:
std::map<int,Konto*>::iterator it;


hast, kannst du auf den int mit it->first, und auf den Konto* mit it->second zugreifen. Wenn du dann den Zeiger auf das Konto hast, kannst du ganz normal die member aufrufen. Zum Beispiel:

C++:
it->second->k->getName();


So wird das aber nicht klappen, weil k privat ist. Du brauchst noch eine Funktion, die dir k zurückliefert.

C++:
const Kunde* getKunde() const {return k;};



Insgesamt also

C++:
it->second->getKunde()->getName();


Dieser Post wurde am 14.06.2005 um 14:07 Uhr von doppler editiert.
 
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: