2009-12-24 2 views
0
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"); 

Так При возникновении вопросов являютсяКак std :: string перегружает оператор присваивания?

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

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

спасибо.

ответ

5

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

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

линия у вас возникли проблемы с:

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

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

+1

Ему нужны оба, если он хочет выполнить назначение ранее существовавших объектов. – Potatoswatter

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

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

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

mystring& operator=(const char * s); 

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

+0

Разве Рассел удалил свой ответ? – Potatoswatter

+0

Хм, да, он по какой-то причине. – vava

+0

'' string "' имеет тип 'const char [7]', а не 'const char *'. Что касается оператора присваивания, то да, он должен быть перегружен для 'const char *', который является типом, в котором будет затухать массив. – AnT

0
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; 
} 
  • Я добавил «&» для ваших строк, так это возвращает ссылку на «это», а не копию этого (это хорошая практика, чтобы сделать для входного параметра слишком , как вы «повторно, то не uneccessarily сделать копию входной строки),
  • Я сменил а„+“до» < < 'в строке 2
  • и я изменил свой массив в const char const * указатель