Frage

class mystring { 
private:
 string s;
public:
 mystring(string ss) { 
  cout << "mystring : mystring() : " + s <<endl; 
  s = ss;
 }
 /*! mystring& operator=(const string ss) { 
  cout << "mystring : mystring& operator=(string) : " + s <<endl;
  s = ss; 
  //! return this; 
  return (mystring&)this; // why COMPILE ERROR
 } */
 mystring operator=(const string ss) {
  cout << "mystring : mystring operator=(string) : " + s <<endl;
  s = ss;
  return *this;
 } 
 mystring operator=(const char ss[]) {
  cout << "mystring : mystring operator=(char[]) : " << ss <<endl;
  s = ss;
  return *this;
 }
};

mystring str1 =  "abc"; // why COMPILE ERROR
mystring *str2 = new mystring("bcd");

Die Fragen sind also

  1. Wie mache ich ein korrektes MyString & opeartor = Überladung? Das heißt, wie könnte ich eine Referenz zurückgeben und nicht einen Zeiger?

  2. Wie erstellt man einen korrekten MyString -Operator = Überladung? Ich dachte, der Quellcode würde einwandfrei funktionieren, aber es stellt sich heraus, dass ich MyString immer noch nicht Const Char [] zuweisen konnte, als hätte ich den Operator nicht überlastet =.

Danke.

War es hilfreich?

Lösung

Was Sie brauchen, ist ein "Conversion" -Konstruktor, der a nimmt const char*:

mystring( char const* ss) {
  cout << "mystring : mystring(char*) ctor : " << ss <<endl;
  s = ss;
}

Die Linie, mit der Sie ein Problem haben:

mystring str1 =  "abc"; // why COMPILE ERROR

Ist nicht wirklich eine Aufgabe - es ist ein Initialisierer.

Andere Tipps

mystring& operator=(const string &ss) 
{
    cout << "mystring : mystring operator=(string) : " + s <<endl;
    s = ss;

    return *this; // return the reference to LHS object.
} 

Wie andere betonten, "string" hat const char * Geben Sie ein und Sie sollten den Zuordnungsbetreiber dafür überlasten.

mystring& operator=(const char * s);

Um eine Referenz von einem Zeiger zu erhalten *this ist ausreichend, keine Notwendigkeit, etwas zu werfen.

 mystring& operator=(const string& ss) {
  cout << "mystring : mystring operator=(string) : " << s << endl;
  s = ss;

  return *this;
 } 
 mystring& operator=(const char* const pStr) {
  cout << "mystring : mystring operator=(zzzz) : " << pStr << endl;
  s = pStr;

  return *this;
 }
  • Ich habe Ihre Saiten '&' hinzugefügt, damit es einen Verweis auf 'This' und keine Kopie davon zurückgibt (es ist eine gute Praxis, dies auch für den Eingabeparameter zu tun, da Sie dann nicht unaufhörlich eine Kopie der Eingabezeichenfolge erstellen). Anwesend
  • Ich habe in Zeile 2 ein '+' gegen '<<' getauscht
  • Und ich habe Ihr Array zu a geändertconst char Const* Zeiger
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top