C++ Nicht deklarierter Bezeichner und unbekannter Bezeichner

KabyZen

Banned
Registriert
März 2017
Beiträge
23
Hallo zusammen,

aktuell versuche ich etwas C++ zu lernen. Jedoch habe ich nun das Problem in meinem Code, dass die Fehlermeldung erscheint, dass der Bezeichner "GetGuess" nicht gefunden wurde und dass der Bezeichner "Guess" nicht deklariert sei.

Diese Fehler treten in meiner Funktion PlayGame auf. Ich hänge euch mal den gesamten Quelltext an:

Code:
#include <iostream> 
#include <string>

void PrintIntro();
string GetGuess();
void PlayGame();

using namespace std; 

int main() 
{
	PrintIntro();
	PlayGame();
	return 0;
}

void PrintIntro() 
{
	constexpr int WorldLength = 9; 
	cout << "Willkommen beim Bull-Cow-Spiel!" << endl; 
	cout << "Kannst Du das Isogramm mit " << WorldLength << " Buchstaben erraten, an welches ich gerade denke?" << endl;
	return;
}

string GetGuess() 
{
	string Guess = ""; 
	cout << "Errate den Begriff: " << flush;
	getline(cin, Guess); 
	return Guess;
	
}

void PlayGame()
{
	constexpr int NUMBER_OF_TURNS = 5;
	for (int count = 1; count <= NUMBER_OF_TURNS; count++)
	{
		string Guess = GetGuess();
		cout << "Dein Versuch war: " << Guess << endl;
		cout << endl;
	}
}

Findet dort jemand von euch den Fehler?
 
@Bob: entweder hast du was zum Thema zu sagen oder hälst die Fr....

@KabyZen: kannst du die komplette Ausgabe vom Compiler posten? Dann könnte man auch sehen wo we genau meckert, d.h. welche Zeile ihm nicht gefällt.
 
Wenn ich deinen Code kompilere kriege ich eine passendere Fehlermeldung: "Type string does not name a type.". Der Fehler scheint zu sein, dass du das "using namespace std;" Nach der forward-declaration der GetGuess Funktion hast. Ändere ich das, compiliert es bei mir.

Bob9896 schrieb:
ich würd auf java umsteigen.

Das ist ja eine super konstruktive Antwort! Sagst du auch Leuten, die Probleme mit ihrem Computer haben sie sollen doch mal lieber wandern gehen?
 
Hey HominiLupus,
danke für Deine Antwort! Ich habe es nochmal versucht zu compilieren.. und siehe da, jetzt meckert er an mehreren Stellen.

Hier einmal der Output der Konsole:
1>c.main.cpp(6): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c.main.cpp(6): error C2146: Syntaxfehler: Fehlendes ";" vor Bezeichner "GetGuess"
1>c.main.cpp(26): error C2872: "string": Mehrdeutiges Symbol
1>c.main.cpp(6): note: kann "int string" sein
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\include\xstring(3998): note: oder "std::string"
1>c.main.cpp(26): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>c.main.cpp(26): error C2086: "int string": Neudefinition
1>c.main.cpp(6): note: Siehe Deklaration von "string"
1>c.main.cpp(26): error C2146: Syntaxfehler: Fehlendes ";" vor Bezeichner "GetGuess"
1>c.main.cpp(27): error C2143: Syntaxfehler: Es fehlt ";" vor "{"
1>c.main.cpp(27): error C2447: "{": Funktionsheader fehlt - Parameterliste im alten Stil?
1>c.main.cpp(40): error C2872: "string": Mehrdeutiges Symbol
1>c.main.cpp(6): note: kann "int string" sein
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.10.25017\include\xstring(3998): note: oder "std::string"
1>c.main.cpp(40): error C2146: Syntaxfehler: Fehlendes ";" vor Bezeichner "Guess"
1>c.main.cpp(40): error C2065: "Guess": nichtdeklarierter Bezeichner
1>c.main.cpp(40): error C3861: "GetGuess": Bezeichner wurde nicht gefunden.
1>c.main.cpp(41): error C2065: "Guess": nichtdeklarierter Bezeichner
1>Die Erstellung des Projekts "BullCowGame.vcxproj" ist abgeschlossen -- FEHLER.
========== Erstellen: 0 erfolgreich, 1 fehlerhaft, 0 aktuell, 0 übersprungen ==========

Edit: Danke Dir, Nemesis! Darauf hätte ich auch selbst kommen können.. :) Aber wenn es nicht stört hätte ich noch ein paar andere Fragen zu ein paar Dingen! :)
 
Du musst es so machen:

Code:
#include <iostream> 
#include <string>

using namespace std;

void PrintIntro()
{
	constexpr int WorldLength = 9;
	cout << "Willkommen beim Bull-Cow-Spiel!" << endl;
	cout << "Kannst Du das Isogramm mit " << WorldLength << " Buchstaben erraten, an welches ich gerade denke?" << endl;
	return;
}

string GetGuess()
{
	string Guess = "";
	cout << "Errate den Begriff: " << flush;
	getline(cin, Guess);
	return Guess;

}

void PlayGame()
{
	constexpr int NUMBER_OF_TURNS = 5;
	for (int count = 1; count <= NUMBER_OF_TURNS; count++)
	{
		string Guess = GetGuess();
		cout << "Dein Versuch war: " << Guess << endl;
		cout << endl;
	}
}


int main()
{
	PrintIntro();
	PlayGame();
	return 0;
}
 
Oder am besten die Methodendeklarationen in ein .h file auslagern. Dann ist es egal in welcher Reihenfolge die im .cpp stehen. Und zu lernen mit .h files umzugehen ist sowieso Elementar beim C++ lernen ;)
 
Danke, LumPe! Ist mir jetzt auch aufgefallen, dass ich den Namespace weiter nach oben packen hätte sollen.. war aber zu sehr auf die Syntax fokusiert.. man lernt nie aus!

Ein paar Fragen noch, falls ihr so nett seid und mir diese beantworten möchtet:

- Kann es sein, dass Funktionen vom Typ String in einem Header nicht so wollen? Ich habe versuch einen einfachen Header zu erstellen und diesen mit "#include "header.h" zu inkludieren. Void schluckt er ohne Probleme, aber beim String wirft er auch Fehler aus.

- Warum gilt prinzipiell alles über 2 als "Magische Nummer" und warum sollte man diese nicht verwenden? Ich meine, ich kann doch auch so einmalig eine Variabel erstellen und dieser einen Wert zuweisen, der Nutzen von constexpr erschließt sich mir da nicht.. :)
 
Du musst #include <string> vor #include "header.h" haben.
Du kannst auch #include <string> im Header haben.

void ist ein Keyword der Sprache, da brauchts nix, genauso wie int, das wird immer und überall erkannt. string ist ein Datentyp der in der Sprache selbst erschaffen wurde und der wie jede andere Funktion oder struct oder sonstwas zuerst deklariert werden muss bevor er benutzt werden kann. Für void hast du keine include Datei, für string schon.

Es ist klarer und vor allem verständlicher wenn man fixe Zahlen die eine spezielle Bedeutung haben als benannte Konstanten mit einem aussagekräftigen Namen versieht. Da reicht aber auch einfach ein #define MAGICNUMBER 777
 
Ich hab letztens erst gelesen man solle selbst defines für Magic numbers vermeiden, da sie beim Debuggen dann ja auch wieder als reine Zahl auftauchen und lieber Konstanten verwenden.
Schien mir so weit ganz logisch, hatte ich davor aber auch nie von gehört
 
Danke für die Antwort, ZuseZ3!

Andere Frage: warum raten viele davon ab using namespace zu verwenden?

Soweit ich das verstanden habe: da quasi mehrere Bibliotheken den selben Namespace haben können und dort auch die selbe oder ähnlichen Funktionen vorkommen kann und man so durcheinander kommen kann, richtig?

So nach dem Motto "Da stehen zwei identische Autos - welches war jetzt nochmal meins?"

Grüße!
 
Zuletzt bearbeitet:
Richtig, bei meiner aktuellen Arbeit ist es so geregelt, dass using namespaces höchstens local (innerhalb von {} ) genutzt werden duerfen, eher soll aber mittels :: zugegriffen werden.

Und wo wir gerade bei Autos sind, da jemand mal den selben Wagen in der selben Farbe hinter unseren gestellt hat, ohne abzuschließen (:freak:) und ich natuerlich souverän in den falschen eingestiegen bin passe ich da auch immer brav auf und nutze :: :D
 
Richtig, #defines sind fuer Konstanten zu vermeiden. Fuer Ausfuehrungen siehe das Buch "Effective C++" von Scott Meyers, welches dem Thema ein eigenes Item widmet.
 

Ähnliche Themen

Zurück
Oben