"<objekt>": Unbekannter Überschreibungsspezifierer [C++ | Visual Studio Community]?
Hallo, lieber Leser,
leider gelingt es mir partout nicht, Objektinstanzen innerhalb von Klassen weiter zu verwenden und ich befürchte, dass ich etwas Grundlegendes im Konzept der OOP übersehe bzw. nicht kenne.
In einem kleinen Freizeitprojekt von mir werden, was Beweggrund für diesen Post hier war, leider eine Reihe von Fehlern ausgespuckt, für die zu lösen zu versuchen ich schon eine Menge Zeit aufgewandt habe und welche ich alle auf eine Unkenntnis eines wichtigen Konzeptes, wie oben schon beschrieben, zurückführe.
Ich würde mich über konkrete Lösungsvorschläge genauso freuen, wie auf Hinweise, was ich wohl konzeptuell nicht so recht verstanden habe. Vielen Dank.
main.cpp: https://pastebin.com/PKCF75FR
Fehler: Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
Fehler C3646 "difficulty": Unbekannter Überschreibungsspezifizierer C:\Users*\source\repos*\main.cpp 9
Fehler C3646 "getDifficulty": Unbekannter Überschreibungsspezifizierer C:\Users*\source\repos*\main.cpp 20
Fehler C2065 "Item": nichtdeklarierter Bezeichner C:\Users*\source\repos*\main.cpp 76
Fehler C3646 "playerClass": Unbekannter Überschreibungsspezifizierer C:\Users*\source\repos*\main.cpp 73
Fehler C2923 "std::vector": "Item" ist kein gültiges Vorlage-Typargument für den _Ty-Parameter. C:\Users*\source\repos*\main.cpp 76
Fehler C4430 Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. * C:\Users*\source\repos*\main.cpp 73
Fehler C2059 Syntaxfehler: "(" C:\Users*\source\repos*\main.cpp 20
Fehler C2059 Syntaxfehler: "=" C:\Users*\source\repos*\main.cpp 9
Fehler C2238 Unerwartete(s) Token vor ";" C:\Users*\source\repos*\main.cpp 9
Fehler C2334 Unerwartete(s) Token vor "{"; sichtbarer Funktionstext wird übersprungen C:\Users*\source\repos*\main.cpp 20
Fehler C1903 Weiterverarbeitung nach vorherigem Fehler nicht möglich; Kompilierung wird abgebrochen. C:\Users*\source\repos*\main.cpp 76
Grundlegende Fehler, also noch grundlegender, als die oben beschriebenen, dürfen ignoriert werden.
2 Antworten
Der Compiler kennt nur, was er schon gesehen hat.
Du nutzt in Game Difficulty, ohne daß der Compiler es kennt.
Also ziehst Du die Klasse Difficulty besser vor die Klasse Game.
----
Ordne das mal insgesamt entsprechend neu, das sollte schon einiges eleminieren.
Dann schauen wir uns den Rest an.
Nachtrag: Je nach Bedarf kannst Du auch Forward Declarations nutzen, aber eien Grundordnung in Hinsicht auf die Abhängigkeiten ist trotzdem sinnvoll.
Und gewöhne Dir bitte gleich an, die Schnittstellenbeschreibung von der Implementierung abzutrennen.
D.h. Du schreibst eine leere class, mit Informationen über die Methoden und Member, implementierst sie aber nicht.
Wenn Du die Beschreibungen entsprechend sortiert, können die Klassen sich gegenseitig nutzen. Die Implementierung der Methoden kannst Du dann getrennt sonstwo und auch kunterbunt machen (kunterbunt=nicht zu empfehlen), ohne daß es zu Problemem wegen unbekannter Typen o.ä. kommt.
class Game {
private:
bool active;
Difficulty difficulty = Difficulty("descption", 1);
public:
// Get and set private values.
// active
bool getGameStatus();
void setGameStatus(bool active);
// difficulty
Difficulty getDifficulty();
};
//Impl.:
bool Game::getGameStatus() { return active;}
Game::setGameStatus( bool active){ this->active=active;}
Difficulty Game::getDifficulty(){return difficulty;}
Man 'entkernt' die Klasse praktisch weitgehend. Dadurch wird es leichter Header+Unit zu erstellen und auch die (Kreuz)refernzierungen machen weniger Probleme.
Die einzelnen Definitionen der Methoden sind so auch besser unabhängig zu betrachten.
Die Fehler wurden durch diese Neuanordnung aufgelöst. Den hier angegebenen Hinweis habe ich insofern berücksichtigt, als dass ich mich entschieden habe, die Klassen in eigene Dateien eigens jeweils für jede Klasse auszulagern.
Vielen Dank nochmals.
Ich kenne mich mit C++ wenig aus, doch kann es sein, dass du schlicht die Klassen deklarieren musst, bevor du sie verwendest?
So, wie das in folgendem Link gemacht wird:
Wenn ich sie noch mal extra deklariere, gibt mit der Compiler aus, dass bei "Klasse_A a = A();" "Klasse_A" kein Typname wäre.
Alles klar, vielen Dank für den Hinweis. Ich werde diese Änderungen baldmöglichst vornehmen.