Überladung des Zuweisungsoperators funktioniert nicht.
-
Hallo,
bin neu hier im Forum, sowie relativ ungeübt was die C++ Programmierung angeht.
Mein Problem ist folgendes: Ich hab mir nun schon ein paar Artikel im Bezug auf die Überladung des Zuweisungsoperators "=" durchgelesen. Meiner Meinung nach stimmt das was ich fabriziert habe auch.
Code der main.cpp
#include <iostream> #include <string> #include "string.h" using namespace::std; using std::string; int main() { String string1 ("Geniessen Sie "); String string2; cout << "Der String '" << string1 << "' hat " << string1.getLength() << " Zeichen!" << endl; cout << "Der String '" << string2 << "' hat " << string2.getLength() << " Zeichen!" << endl; cout << "Anzahl String-Objekte: " << String::getNumberOfStringObjects() << endl; string2 = string1; string1 = "Keep smiling!"; String string3(string1); cout << "string1: " << string1 << endl; cout << "string2: " << string2 << endl; cout << "string3: " << string3 << endl; cout << "Anzahl String-Objekte: " << String::getNumberOfStringObjects() << endl; cin.ignore(); return 0; }Code der string.h
#include <iostream> #include <string> using namespace::std; using std::string; static int numberOfStringObjects = 0; class String { private: string content; int length; public: String() { length = 0; numberOfStringObjects++; } String(string content) { setLength(content); setString(content); numberOfStringObjects++; } friend ostream& operator << (ostream&, const String&); String& operator = (const String& str); void setString(string thecontent) { content = thecontent; } string getString() { return content; } void setLength(string thestring) { length = thestring.length(); } int getLength() { return length; } static int getNumberOfStringObjects() { return numberOfStringObjects; } }; ostream& operator << (ostream& os, const String& str) { os << str.content; return os; } String& String::operator = (const String& str) { content = str.content; return *this; }Wenn ich nun versuche das Programm auszuführen zeigt mir der Compiler folgenden Fehler an:
error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'const char [14]' akzeptiert (oder keine geeignete Konvertierung möglich)
Das Ganze bezieht sich auf die Zeile 17 der main.cpp, dort soll das Objekt string1 den Wert des C-Strings "Keep Smiling!" annehmen.Seht ihr den Fehler und könnt mir helfen?!
Grüße
D
-
Ich denke, Du brauchst entweder einen
String::String(char const *);oder einen
String& String::operator=(char const *);
-
Ein
String& String::operator = (const string& str);würde auch reichen. Punkt ist: Rechts steht ein
const char[14], es ist aber einStringnötig. Einconst char[14]kann zwar in einenstd::stringumgewandelt werden und einstd::stringin einenString, aber mehr als eine Station macht der Compiler nicht automatisch, sonst würde am Ende jeder Unsinnscode funktionieren, weil alles irgendwie in alles umwandelbar ist.P.S.: Und bitte lass using namespaces in Headerdateien sein. Wenn man das macht, untergräbt man das Konzept der namespaces.
P.P.S.: Und schau dir mal an, was Initialisierungslisten sind. Kommt wahrscheinlich bald in deinem Lehrbuch, falls es bis hierhin noch nicht dran war.
-
Servus,
schonmal vielen Dank für die schnellen Antworten. Habe es nun folgendermaßen gemanaged:
String::String(char const * str) { setString(str); numberOfStringObjects++; }Hatte es auch vorher schonmal mit einem Typkonvertierungskonstruktor probiert, allerdings war die Parameterangabe bei mir wahrscheinlich zu uneindeutig. Dickes Dankeschön an Caligulaminus!
Danke für die Tipps SeppJ, wenn ich aber die namespaces in der .h Datei entferne bekomme ich ne ganze Latte an Fehlermeldungen vom Compiler. Das es nicht unbedingt sauber ist wenn ich das da reinschreibe habe ich auch schon sehr oft gelesen.
Aber im Moment liegt mein Fokus mehr darauf, überhaupt irgendwas hinzubekommen.
Grüße
D
-
savethedave schrieb:
Danke für die Tipps SeppJ, wenn ich aber die namespaces in der .h Datei entferne bekomme ich ne ganze Latte an Fehlermeldungen vom Compiler.
Klar, du musst ja auch überall wo es nötig ist ein std:: schreiben.
Das es nicht unbedingt sauber ist wenn ich das da reinschreibe habe ich auch schon sehr oft gelesen.
Aber im Moment liegt mein Fokus mehr darauf, überhaupt irgendwas hinzubekommen.
Du möchtest also trainieren, wie es unsauber geht? Ist das wirklich eine gute Idee?
-
Servus,
eine gute Idee ist das sicher nicht, aber ich habe zur Zeit noch ganz andere Baustellen zu bearbeiten. Kommt Zeit, kommt Sauberkeit.

Das mit dem std:: sollte ich mir allerdings wirklich mal angewöhnen.
Ich habe mir auch mal ein bisschen was in Sachen Initialisierungslisten durchgelesen. Die scheinen ja wirklich praktisch zu sein wenn man mehrere Klassen hat und Konstruktoren der einen Klasse, Objekte einer anderen erzeugen sollen. Dran war das bei uns zwar noch nicht, wird aber bestimmt bald kommen.greets
D