Как std :: string перегружает оператор присваивания? - PullRequest
0 голосов
/ 24 декабря 2009
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");

Итак, вопросы

  1. как правильно исправить mystring & opeartor = overload? То есть, как я могу вернуть ссылку, а не указатель? (Можем ли мы переходить между ссылкой и указателем в C ++?)

  2. как сделать правильный оператор mystring = перегрузка? Я думал, что исходный код будет работать нормально, но оказалось, что я все еще не мог назначить const char [] для mystring, как будто я не перегружал оператор = .

спасибо.

Ответы [ 4 ]

5 голосов
/ 24 декабря 2009

Вам нужен конструктор «преобразования», который принимает const char*:

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

Строка, с которой у вас возникли проблемы:

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

на самом деле не назначение - это инициализатор.

3 голосов
/ 24 декабря 2009
mystring& operator=(const string &ss) 
{
    cout << "mystring : mystring operator=(string) : " + s <<endl;
    s = ss;

    return *this; // return the reference to LHS object.
} 
0 голосов
/ 24 декабря 2009
 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;
 }
  • Я добавил '&' в твои строки, чтобы возвращает ссылку на «это», а не его копия (это хорошая практика для сделать это для входного параметра тоже как вы тогда не без особого труда копия входной строки),
  • Я поменял '+' на '<<' в строке 2 </li>
  • и я изменил ваш массив в const char const * указатель
0 голосов
/ 24 декабря 2009

Как отмечали другие, "string" имеет тип const char *, и вам следует перегрузить оператор присваивания для него.

mystring& operator=(const char * s);

Чтобы получить ссылку из указателя, достаточно *this, не нужно ничего разыгрывать.

...