Mehrdeutiges Symbol
-
inp schrieb:
so sollte das klappen.
string.h
#pragma once class string { public: string(char x); private: char a; };string.cpp
#include "string.h" string::string(char x) : a(x) { }main.cpp
#include "string.h" //include <string> //std::string -> gleicher name wie string aus string.h //using namespace std // fusioniert namespace std mit namespace global, potentielle mehrfache symbole mit deiner namesgebung. int main(int, char**) { string str('a'); return 0; }Danke erstmal
so funktionierts. Bin zwar noch am grübeln warum und wieseo.....
-
Hallo
nun will ich den Übergebenen Buchstaben in eine Liste rein schreiben?
Frage:
Muss ich hierzu = überladen?? weil:Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'char' akzeptiert (oder keine geeignete Konvertierung möglich)
string::string(char x) { struct Buchstabenliste { char buchstabe; Buchstabenliste *next;} b1; b1=x; }
-
b1.buchstabe=x;
ich seh schon den wald vor bäumen nicht mehr
-
wenn ich jetzt folgendes machen will
#include "string.h" #include <iostream> int main() { string str ='a'; cout << "HALLO" << endl; return 0;dann sagt er
error C2065: 'cout': nichtdeklarierter Bezeichner
warum das denn??
-
Weil cout seit ca. 10 Jahren im Namensraum std liegt. Benutze entweder std::cout oder... Nein, da Deine Klasse "string" heisst, benutze std::cout.
-
entweder
... using namespace std; ... cout << ...; ...aber da wirst du eine nameskollision bekommen (mehrdeutige symbole)

wie im vorigen beispiel wg deiner string klasse und der std::string klasseoder
... std::cout << ...; ...
-
keiner eine ahnung???
-
irgendwie versteh ich das nicht.
kann mir vll jemand das mit dieser "Namenskollision erklären"
-
kann das sein das es im namespace std auch irgendwas gibt was string heißt??
d.h. ich sollte meine klasse string1 oder so nennen???
-
WAS funktioniert an std::cout nicht?
WAS verstehst Du nicht an "wg deiner string klasse und der std::string klasse"?Zu string1: Nein, musst Du nicht. Dafür gibt es Namensräume. (Damit und mit etwas nachdenken sollte sich auch der Begriff "Namenskollision" klären)
-
Endlich hat er's...
namespace std { class string : public basic_string< ... >; // gibt's schon. } // und dann deine im "globalen" namespace: class string; // und dann using namespace std; // und dann string foo; // boooom!Also: Entweder anderer Name, bei der verwendung "deines" string's kein using namespace std und auf keinen Fall #include <string> oder deinen string in einen anderen Namespace und tierisch aufpassen...
greetz, Swordfish
-
das std::cou funktioniert.
Ich weiß nur nicht so richtig warum. und warum ich using namespace std nicht einfügen kann.Ich vermute:
Im namespace std gibt es wohl schon eine klasse die string heißt, und wenn ich std einfüge weiß er nicht welche klasse er verwenden soll ---> namenskollision.da ich std dann halt nicht eingefügt habe funktioniert cout auch nicht.
wenn ich jetzt meine klasse string1 nenne, und std einfüge müsste ich cout verwenden können.
Ist das so richtig??
-
so, habs versucht.
funktionieren tut es, wäre noch nett wenn mir jemand sagt ob mein verständnis dafür auch richtig ist
-
physikus schrieb:
so, habs versucht.
funktionieren tut es, wäre noch nett wenn mir jemand sagt ob mein verständnis dafür auch richtig ist
ja hast du
-
guck dir am besten mal irgendwo ne erklärung von namespaces an. die hier z.b.: http://de.wikibooks.org/wiki/C++-Programmierung:_Namensräume
scheinst es aber grundlegend bereits verstanden zu haben.
-
So, als nächstes würde ich gerne << überladen, das funktionierte aber auch nicht so richtig.
//main int main() { astring str ='a'; cout << str << endl; /klasse private: char a; }; //Nicht-Member Funktionen fuer Ein- und Ausgabe ostream& operator<<(ostream&,astring); //methode ostream& operator<<(ostream& s, astring astr) { return s << astr; }ich bekomme zwar keinen fehler, aber ausgeben tut er auch nix
-
physikus schrieb:
So, als nächstes würde ich gerne << überladen, das funktionierte aber auch nicht so richtig.
//main int main() { astring str ='a'; cout << str << endl; /klasse private: char a; }; //Nicht-Member Funktionen fuer Ein- und Ausgabe ostream& operator<<(ostream&,astring); //methode ostream& operator<<(ostream& s, astring astr) { return s << astr; }ich bekomme zwar keinen fehler, aber ausgeben tut er auch nix
ostream& operator << (ostream& s, astring const& astr) { return s << astr.a; }
-
"astring::a": Kein Zugriff auf private Member
wenn ich a public mache bekomm ich einen ganzen haufen fehler
-
physikus schrieb:
"astring::a": Kein Zugriff auf private Member
wenn ich a public mache bekomm ich einen ganzen haufen fehler
class astring { public: ... char get_a() { return a; } private: char a; } ... ostream& operator << (ostream& s, astring const& astr) { return s << astr.get_a(); }
-
char astring::geta() { return astring::a; } ostream& operator << (ostream& s, astring astr) { return s << astr.geta(); } public: astring (char x); char geta() ; private: char a; int main() { astring str ='X'; cout << str << endl;so gibt er mir zwar was aus, aber anstelle dem X ein seltsames zeichen???