enum aus einer Klasse in anderen Klassen verwenden
-
hallo miteinander!
ich schreibe grad an einem Programm und wollte in einer Klasse Record ein enum definieren und in einer anderen klasse dann eine variable von diesem enum-Typ anlegen und der Methode 'getField(Field field)' übergeben.Jedoch weis ich nicht genau wie ich das machen soll
hier die Record.h:
#include <string> using namespace std; #ifndef DATA_H_ #define DATA_H_ enum Field {NAME,VORNAME,STRASSE,PLZ,ORT,TELNR}; class Record { friend class RecordList; public: enum Field {NAME,VORNAME,STRASSE,PLZ,ORT,TELNR}; public: Record(const string &name, const string &vorname, const string &strasse, const string &hausnr, const string &plz,const string &ort, const string &vorwahl, const string &telnr, const string &bilddateiname, bool isdn); Record(); virtual ~Record(); //gibt alle Informationen des Datensatzes aus void printAll(); void swapContents(Record *b); string getField(Field field); Record *prev; Record *next; public: string Name; string Vorname; string Strasse; string Hausnr; string Plz; string Ort; string Vorwahl; string Telnr; string Bilddateiname; bool isdn; }; #endif /* DATA_H_ */und die Record.cpp:
#include "Record.h" #include <string> #include <iostream> Record::Record(const string &name, const string &vorname,const string &strasse, const string &hausnr, const string &plz,const string &ort, const string &vorwahl,const string &telnr, const string &bilddateiname, bool isdn) : prev(NULL),next(NULL), Name(name), Vorname(vorname), Strasse(strasse),Hausnr(hausnr), Plz(plz), Ort(ort), Vorwahl(vorwahl), Telnr(telnr), Bilddateiname(bilddateiname), isdn(isdn) { } Record::Record() :prev(NULL), next(NULL) {} void Record::printAll(){ std::cout << "Name: " << Name << ", Vorname: " << Vorname << ", Straße: " << Strasse << ", " << Hausnr << ", Plz: " << Plz << ", Ort:" << Ort << ", Telnr: " << Vorwahl << " " << Telnr << std::endl << std::flush; } Record::~Record() { // TODO Auto-generated destructor stub } void Record::swapContents(Record *b){ Record tmp(Name, Vorname, Strasse,Hausnr, Plz, Ort,Vorwahl, Telnr, Bilddateiname, isdn); this->Name = b->Name; this->Vorname = b->Vorname; this->Strasse = b->Strasse; this->Hausnr = b->Hausnr; this->Plz = b->Plz; this->Ort = b->Ort; this->Vorwahl = b->Vorwahl; this->Telnr = b->Telnr; this->Bilddateiname = b->Bilddateiname; this->isdn = b->isdn; b->Name = tmp.Name; b->Vorname = tmp.Vorname; b->Strasse = tmp.Strasse; b->Hausnr = tmp.Hausnr; b->Plz = tmp.Plz; b->Ort = tmp.Ort; b->Vorwahl = tmp.Vorwahl; b->Telnr = tmp.Telnr; b->Bilddateiname = tmp.Bilddateiname; b->isdn = tmp.isdn; } string Record::getField(Field field){ switch(field){ case NAME: return Name; break; case VORNAME: return Vorname; break; case STRASSE: return Strasse + Hausnr; break; case PLZ: return Plz; break; case ORT: return Ort; break; case TELNR: return Telnr; break; default: return NULL; } }und die Klasse in der ich die Variable anlege und der Funktion getField(Field field) übergebe:
#include "Record.h" class A{ Field f; f = Record::NAME; string s = getField(f); }vielen dank schon mal im voraus für eure hilfe
-
Hallo heikob,
so sollte es gehen:
struct Foo { enum e {a,b,c}; void bla( e tralala ) {}; }; struct Bar { void sabbel() { Foo::e v( Foo::a ); Foo f; f.bla( v ); } }; int main() { }Ein paar Sachen noch zu deinem Code:
- Field kommt zwei mal vor. Einmal in der klasse und einmal draussen. Warum?
- Eine Funktion, die 10 Parameter nimmt (in deinem fall der ctor) kann schonmal recht unkomfortabel werden.
- Beim Swap implementierst du einen Dreieckstausch, den std::swap schon kann. Bist du sicher, dass du den Inhalt zweier Records swappen können musst? Würde es nicht reichen, die beiden Records einfach da, wo du sie denn dann irgendwann hälst, zu swappen?
- Es sieht so aus, als würdest du teilweise std::map nachprogrammieren. Diese oder eine ähnliche Datenstruktur könnte (zumindest auf Grund von dem, was man bisher sieht) besser geeignet sein. Dann würdest du dir viel Tipparbeit sparen und wärst auch flexibler falls mal neue Datenfelder hinzukommen.
- Die Zeiger prev und next im Record deuten drauf hin, dass du hier selbst soetwas wie std::list nachprogrammierst. Bist du dir sicher, dass das nötig ist?
-
Danke für die Hilfe, habs hin bekommen.
- Hab das enum aus der Klasse gelöscht und über die Klassendeklaration gestellt.
-> das enum ist in allen Klassen, die die Record.h einbinden sichtbar und dann hats funktioniert- ja schon aber ist genau so beabsichtigt, da ein Record einen Eintrag in einem Adressbuch darstellt die später z.T. dann in einer GUI mittels QT dargestellt werden
- ok danke, das mit dem swap wusste ich auch noch nicht. Das swap brauche ich für bubble u. quicksort, mit denen die doppelt verkettete liste sortiert wird
- es war in meiner aufgabenstellung gefordert selbst eine doppelt verkettete Liste zu erstellen, damit man auch mal mit der Speicherverwaltung, copy-Konstruktor u. Assingnment-Operator usw. zu tun hat u. die entstehnden Probleme erkennt u. versteht
is also en bissel umfangreicher als die paar zeilen, die ich geschrieben habe, wusste halt nicht wie ich das mit dem enum machen sollte
P.S: die meisten fehler waren gar keine, hat nur eclipse so angezeigt
-
Na gut, wenns als Übung gedacht ist, kann man sone Liste schonmal selbst implementieren.

Wenns in der Aufgabe gestattet ist, würde ich allerdings die Liste seperat (und generisch) unabhängig von deinem Datum (Record) schreiben. Der Lerneffekt wäre vermutlich noch größer, und es wär sauberer, übersichtlicher und für meinen Geschmack auch einfacher.
Ist es auch vorgegeben, dass du keine Map (oder sonstwas) für die Felder innerhalb eines Records benutzen darfst? Das würde halt wie gesagt zu kürzerem code führen und Erweiterungen mit zusätzlichen Feldern vereinfachen.
-
Ist Teil eines benoteten Praktikums, deswegen sollten wir das selbst implementieren
gruß heiko