Classes, Statics usw. Kompilerfehler
-
Hallo

Ich bin ganz neu hier im Forum, und habe gestern mit C++ begonnen, habe allerdings schon 2 Jahre erfahrung mit dem Syntax.
Ich hab nicht wirklich was im Forum gefunden, weil ich nicht weiß, nach was ich eigentlich Suchen soll

Und zwar möchte ich ersteinmal einen Relativ einfachen Taschenrechner programieren, welcher sich aber die Ergebnisse speichern kann.
Das ganze wollte ich so umsetzen, dass ich das Ergebnis in einem Objekt (object) speichere.
Jedes dieser Objekte hat bei mir zwei Eigenschaften; den Abgespeicherten Wert und einen Namen über das das Objekt später angesproichen werden soll.Damit ich das per Name ansprechen kann, habe ich mich überlegt alle Erezugten Objekte in einen Array zu stecken. Dann kann ich alle Objekte durchsuchen und wenn dann der Name übereinstimmt das Objekt zurückgeben.
Damit ich beim Objekt-zurückgeben nicht immer das Array-Objekt mitgeben muss, hab ich das Statisch angelegt.
Hier auf jeden Fall meine zwei Objekte:class object { public: int wert; string name; object(string sName, int nValue) { wert = nValue; name = sName; } }; class objlist { friend class object; public: static int ID; static object object_list[200]; static int GetID() { return objlist::ID; } static object GetObjectList(int ID) { return objlist::object_list[ID]; } };Und um das ganze nun Konfortabel verwalten zu können hab ich mir dazu ein paar Funktionen geschrieben:
void SetObjectValue(object oObject, int nValue) { oObject.wert = nValue; } void SaveObject(object& oObject) { int nID = objlist::GetID(); nID++; objlist::GetObjectList(nID) = oObject; objlist::ID = nID; } object GetObjectByName(string sName) { int ID = 1; object o = objlist::GetObjectList(ID); object oReturn; while(o.name != "") { if(o.name == sName) { oReturn = o; } ID++; o = objlist::GetObjectList(ID); } return oReturn; } object NewObject(string sName, int nValue) { object oNew(sName, nValue); SaveObject(oNew); return oNew; }Der Restliche Code ist hierfür glaube ich uninteressant. Auf jeden Fall gibt hier der Compiler einen Fehler aus, aber ich verstehe nicht, was er mir damit verklickern will

Hier ist das Compiler-Log:
`Compiler: Default compilerBuilding Makefile: "C:\Users\Daniel\Desktop\cpp\Makefile.win"
Führt make... aus
make.exe -f "C:\Users\Daniel\Desktop\cpp\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/include"
main.cpp: In function `object GetObjectByName(std::string)':
main.cpp:68: error: no matching function for call to `object::object()'
main.cpp:34: note: candidates are: object::object(const object&)
main.cpp:12: note: object::object(std::string, int)
make.exe: *** [main.o] Error 1
Ausführung beendet
`
Eine Erklärung wieso, weshlab und warum wäre auch nett.
Liebe Grüße,
GameScripting
-
Du rufst mit
object oReturn;den parameterlosen Konstruktor von 'object' auf. Da du aber einen eigenen Konstruktor für 'object' erstellt hast, wird dieser Standardkonstruktor vom Compiler NICHT erzeugt und daher kriegst du eine Fehlermeldung.
Abhilfe schafft hier (erstmal -) mit Default-Parametern zu arbeiten:
object(string sName = string(), int nValue = 0) { wert = nValue; name = sName; }Ein paar Tipps zum Weiterlernen:
- informiere dich mal über Initialisierungslisten
- schau dir mal die STL-Containertypen std::vector, std::list, std::map etc. an
- "const correctness"
- ...
-
Vielleicht solltest du dein Design überprüfen ...
ich verweise mal zum Nachlesen auf std::map ... (zB als std::map<string,int>), google doch mal nach Variablenübergabe per Reference und per Value dann weisst du warum selbst nach Fehlerbehebung teile deines Codes nicht funzen werden.
Zum Fehler: dir fehlt, da du selbst EINEN Konstruktor zur Verfügung stellst die automatische Konstruktion des object() Konstruktors ... den brauch er aber wenn du das hier machst ... google oder Forumsuche mal "Regel der Drei" oder auch "Dreierregel" oder so ähnlich
und schau vielleicht in der FAQ nach Buchempfehlungen ;o)
-
Dankesehr für das Tolle Feedback

Ich habe jetzt wie schon gesagt einen weiten Fehler bekommen, den ich auch gerade nicht auszumerzen weiß. Zu sämtliche Themen hab ich mir was angeschaut aber nichts gefunden was mit mit dem Fehler hilft.
Ich habe jetzt alle Übergaben per Value gemacht, der einfachheit wegen.
Ich werde mit nocheinmal das Tutorial durchlesen, mit dem ich begonnen hab, villeicht habe ich dort einfach etwas falsch verstanden.Wer mit aber das Leben einfach machen möchte kann mir auch einfach sagen, weshalb es nicht funktioniert. Ein Beispiel in Form von korrigiertem Code, wäre äußerst Hilfreich

Jetzt der Aktuelle Code:
class object { public: int wert; string name; object(string sName = "", int nValue = 0) { wert = nValue; name = sName; } }; class objlist { friend class object; public: static int ID; static object object_list[200]; static int GetID() { return objlist::ID; } static object GetObjectList(int ID) { return objlist::object_list[ID]; } };Funktionen:
void SetObjectValue(object oObject, int nValue) { oObject.wert = nValue; } void SaveObject(object oObject) { int nID = objlist::GetID(); nID++; objlist::GetObjectList(nID) = oObject; objlist::ID = nID; } object GetObjectByName(string sName) { int ID = 1; object o = objlist::GetObjectList(ID); object oReturn; while(o.name != "") { if(o.name == sName) { oReturn = o; } ID++; o = objlist::GetObjectList(ID); } return oReturn; } object NewObject(string sName, int nValue) { object oNew(sName, nValue); SaveObject(oNew); return oNew; }Compiler-Log:
`Compiler: Default compiler
Building Makefile: "C:\Users\Daniel\Desktop\cpp\Makefile.win"
Führt make... aus
make.exe -f "C:\Users\Daniel\Desktop\cpp\Makefile.win" all
g++.exe -c main.cpp -o main.o -I"C:/Dev-Cpp/include"
g++.exe main.o -o "test.exe" -L"C:/Dev-Cpp/lib"
main.o:main.cpp:(.text+0x21e): undefined reference to `objlist::ID'
main.o:main.cpp:(.text$_ZN7objlist13GetObjectListEi[__ZN7objlist13GetObjectListEi]+0x11): undefined reference to `objlist::object_list'
main.o:main.cpp:(.text$_ZN7objlist5GetIDEv[__ZN7objlist5GetIDEv]+0x4): undefined reference to `objlist::ID'
make.exe: *** [test.exe] Error 1
Ausführung beendet
`
Grüße
-
Statische Membervariablen müssen noch irgendwo definiert werden. Schließlich werden sie bei der Instanzierung der Klasse nicht nochmal erzeugt. Füg der Datei wo die Funktionen definiert sind noch dies hinzu:
int objlist::ID; object objlist::object_list[200];edit: Muss ich mir den gesamten Thread durchlesen um zu erfahren, welchen Sinn eine rein statische Klasse macht?
edit2: Habe ich. Es macht keinen Sinn.
-
Ok, du hast recht. Das Script funktioniert jetzt zwar, aber es macht nicht das es soll. Ich werde es nocheinmal Überdenken.
Danke für Eure Hilfe. Ihr seid wirklich eine tolle Community
