map und klassen
-
hallo ihr da
ich habe für mein spiel paar klassen *wie interessant*
und lege die in ein gemeinsamen container ab und ruf diese per index aufich häts aber lieber das ichs per assoziativen array, also per name darauf zugreifen kann.
map<string, classen> blabla;
ähnlich cbuilder, da gebe ich der komponente einen namen und spreche darüber dann alles an. hier dann halt blaba["klassenname"].irgend_was_anderes_was_ich nicht_weiss
wo müsste ich den "namen" der klasse ablegen, das es am klügsten gelöst wäre?
kenne mich leider mit map nicht so aus, könnte wer ein kurzes beispiel dafür geben wie man das problem löst?könnte einer freundlicherweise
-
Hier hast du ein kleines Beispiel:
Hier ein kleines Beispiel:
#include <iostream> #include <map> #include <string> using namespace std; class BaseClass { protected: std::string m_name; public: BaseClass(){} virtual ~BaseClass(){} virtual void show_name() = 0; }; class InheritedClass : public BaseClass { std::string m_name; public: InheritedClass(){} InheritedClass(std::string name):m_name(name){} virtual ~InheritedClass(){} void show_name(){cout << m_name << endl;} }; int main( int argc, char **argv) { map<string, BaseClass*> kcontainer; kcontainer["Erste"] = new InheritedClass("Erste"); kcontainer["Zweite"] = new InheritedClass("Zweite"); kcontainer["Dritte"] = new InheritedClass("Dritte"); cout << "Erste: "; kcontainer["Erste"] ->show_name(); cout << "Zweite: "; kcontainer["Zweite"]->show_name(); cout << "Dritte: "; kcontainer["Dritte"]->show_name(); system("pause"); }
MfG eViLiSSiMo
-
Hi,
noch eine kleine Anmerkung:
Das mit der BaseClass als Abstrakte Klasse ist eigentlich in diesem Fall unsinnig.
Aber ich wollte damit nur demonstrieren das du dadurch nicht an bestimmte klassen gebunden bist. Evtl. braucht man dafür eine gemeinsame Schnittstelle. Daher die Abstraktion.MfG eViLiSSiMo
-
coooooooooool! ich weiss garnicht wie ich danken kann.
grossen dank an dich
-
ich weiss nciht wie das mit map<> ist .. aber wenn ich new mache muss ichs dann selber mit delete wieder entfernen? ja doch oder?
-
Hi,
das ist richtig du kannst anstatt map< std::string, BaseClass *> -> map< std::string, BaseClass > nehmen;
MfG eViLiSSiMo wobei ich persönlich der Meinung bin das du lieber die Pointer Variante(Erstere nehmen solltest) und zum schluss:
map<string, BaseClass*>::iterator iter; iter = kcontainer.begin(); while(iter != kcontainer.end()) { if(iter->second)delete iter->second; iter++; }
MfG
-
grossen dank. jetzt habe ich wieder viel gelernt
das board gefällt mir, werd das mal jetzt öfters besuchen *grins*
-
IMHO wäre es noch besser, gleich boost::shared_ptr von www.boost.org kennen zu lernen und dann
std::map<std::string, boost::shared_ptr<Basisklasse> >
zu verwenden. boost::shared_ptr ist für STL-Container immer gut, weil durch ihn das Löschen am Ende entfällt und man allgemein auf der sichereren und komfortableren Seite lebt.
Die Variante ganz ohne Zeiger geht nicht, wenn du Objekte verschiedener Klassen in einen Container verpacken willst.
-
eViLiSSiMo schrieb:
das ist richtig du kannst anstatt map< std::string, BaseClass *> -> map< std::string, BaseClass > nehmen;
können schon... aber wo wäre da der sinn? Es würde ja nicht das machen, was ein naiver leser des codes erwarten würde...