002
29.05.2012, 11:29 Uhr
distorted newbie
|
Hallo TOSHMAX,
Erst mal vielen Dank für Deine Hilfestellung. Ehrlich gesagt war ich an dem Nachmittag, an dem ich das Ding gepostet habe, nervlich schon ziemlich auf Null. Was die Speicherlecks angeht, hast Du selbstverständlich recht, obwohl es mir erst mal reicht, überhaupt eine lauffähiges Struktur mit den eingangs erwähnten Funktionlitäten zustande zu bringen. Dass der Doppelpunkt an der Stelle eine Verlegensheitslösung war, war mir auch relativ klar, aber der (eigentlich logische) Pfeil führte zu einem Kompilierungsfehler.
Wie dem auch sei - ich habe den ganzen Krempel überarbeitet (zunächst mal, ohne mögliche Lecks zu berücksichtigen) und es funktioniert jetzt mit Einschränkungen, auf die ich weiter unten noch zu sprechen kommen möchte:
C++: |
#include <stdio.h> #include <iostream> #include <cstdlib> #include <string> #include <map> #include <vector>
using namespace std;
class menueItemBase { public: int var1; string var2; map <string, string> titles;
menueItemBase(); ~menueItemBase(){}
void show_title(string lang) { cout << this->titles[lang].c_str() << endl; } void set_title(string lang, string title) { this->titles.insert(pair<string, string> (lang, title)); }
};
menueItemBase::menueItemBase(){}
class menueItem: public menueItemBase { public: int counter; vector<menueItemBase*>subitems;
menueItem(); ~menueItem(){}
void show_subitems(string lang, menueItem* obj) { for (unsigned i=0; i<obj->subitems.size(); i++) { obj->subitems[i]->show_title(lang); //obj->subitems[i]->show_subitems(lang, obj->subitems[i]); } }; };
menueItem::menueItem() {}
int main() { menueItem *o1 = new menueItem; o1->set_title("en", "Main Menue"); o1->set_title("de", "Hauptmenü");
menueItem *o2 = new menueItem; o2->set_title("en", "Edit"); o2->set_title("de", "Bearbeiten");
menueItem *o3 = new menueItem; o3->set_title("en", "Preferences"); o3->set_title("de", "Einstellungen");
o2->subitems.push_back(o3); o1->subitems.push_back(o2);
menueItem *o4 = new menueItem; o4->set_title("en", "View"); o4->set_title("de", "Ansicht");
cout << "--------------" << endl;
o1->subitems.push_back(o4);
o1->show_title("de");
cout << "--------------" << endl;
o1->show_subitems("de", o1);
cout << "--------------" << endl;
o2->show_subitems("en", o2);
cout << "--------------" << endl;
}
|
Als Ausgabe liefert main() nun zunächst wunschgemäß folgendes:
Code: |
-------------- Hauptmenü -------------- Bearbeiten Ansicht -------------- Preferences --------------
|
So wie es da steht, habe wurde dieses Gebilde fehlerfrei kompiliert es und funktioniert auch - allerdings nur (und darin besteht mein derzeitiges Problem), weil eine Zeile in der Funktion show_subitems() auskommentiert ist - dazu gleich mehr.
Zunächst einige Worte zum Aufbau:
Damit der Vektor subitems, über den jede Instanz der Klasse menueItem verfügt, Objekte aufnehmen kann, muss er benutzerdefiniert (also auf einer Klasse basieren) - soweit richtig, oder?
Der Vektor wird von der Klasse menueItemBase bereitgestellt. Neben diesem erbt die Klasse menueItem von menueItemBase ein paar Eigenschaften und Methoden (in Wirklichkeit erheblich mehr, als hier dargestellt - wie auch immer.)
Jedenfalls ist ein Objekt der Klasse menueItem nun in der Lage, in diesem Vektor beliebig viele Objekte der eigenen Art zu enthalten. Darüber war ich zunächst schon mal sehr glücklich - aber nicht allzu lange, da ich diese Objekte auch wieder rekursiv auslesen will.
Kommentiere ich in der Funktion show_subitems zu diesem Zweck die Zeile, von der ich glaubte, dass sie evtl. dafür sorgen könnte, dass die Funktion alle Vektoren aller Unterobjekte ausließt...
Code: |
obj->subitems[i]->show_subitems(lang, obj->subitems[i]);
|
...ein, wirft der Kompiler folgenden Fehler:
Code: |
menueItem.cpp: In member function ‘void menueItem::show_subitems(std::string, menueItem*)’: menueItem.cpp:43: error: ‘class menueItemBase’ has no member named ‘show_subitems’
|
Das wiederum verstehe ich nicht, weil alle erzeugten Objekte als Instanzen der Klasse menuItem intialisiert wurden und diese ja doch die Funktion show_subitems() bereitstellt.
Vielen Dank im Voraus für jede weitere Hilfe und schönen Tag noch -- OS: Debian 6.0.5 Compiler: g++ (Debian 4.4.5-8) 4.4.5 |