Mehrdeutiges Symbol
-
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???
-
ich befürchte fast in a steht nichts sinnvolles drinnen

wahrscheinlich fehlerhaft initialisiert ?ausserdem musst du a nicht mit dem klassennamen qualifizieren wenn du dich innerhalb einem definierten scope ( astring:: ) befindest
char astring::geta() { return astring::a; }das reicht vollkommen
char astring::geta() { return a; }
-
so , jetz gehts. da ich die char in eine liste einbinden will hatte ich das auch direkt versucht. Dadurch ging das nicht.
war wohl ein denkfehler von mir[/cpp]astring::astring(char x)
{
a=x;
/*
struct Buchstabenliste {
char buchstabe;
Buchstabenliste *next;} b1;b1.buchstabe=x;
*/
}char astring::geta()
{
return a;
}[cpp]aber nochmals danke für deine (eure) hilfe
-
physikus schrieb:
so , jetz gehts. da ich die char in eine liste einbinden will hatte ich das auch direkt versucht. Dadurch ging das nicht.
war wohl ein denkfehler von mirastring::astring(char x) { a=x; /* struct Buchstabenliste { char buchstabe; Buchstabenliste *next;} b1; b1.buchstabe=x; */ } char astring::geta() { return a; }aber nochmals danke für deine (eure) hilfe
ich hab mich die ganze zeit über gewundert was du für einen seltsamen string machst

du solltest nach möglichkeit vermeiden einen string als zeigerverkette liste von einzelnen chars zu machen.
die grösse der datentypen variiert von implementation zu implementation.
aber ein char wird fast immer und überall 1byte gross sein, wobei ein pointer auf ein objekt 4bytes gross istdh du speicherst dir pro zeichen nicht 1byte sondern 5byte, wegen alignment werdens wohl 8byte werden.
dh ein string von 1mb ist dann in wirklichkeit 8mb gross, das ist die wohl schlechteste art und weise einen string zu speichern.
struct buchstabenliste { char a; // 1 byte gross buchstabenliste *next; //4 byte gross }