Инициализируйте объект значением, используя оператор "=" в C ++ - PullRequest
0 голосов
/ 06 октября 2018

У меня есть класс с одним полем.Я хочу перегрузить оператор =, чтобы я мог назначить строку непосредственно члену str класса.Вот мой пример, но компилятор говорит cannot convert from const char[10] to strtype Я хотел бы спросить, почему это так?

#include <iostream>
#include <string>

using namespace std;

class strtype {
    string str;
public:
    strtype()
    {
        str = "Test";
    }

    strtype(string ss)
    {
        str = ss;
    }

    strtype operator= (strtype &st)
    {
        strtype tmp;
        tmp.str = st.str;
        return tmp;
    }
};

int main()
{
    strtype d = "NEWSPAPER";

}

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Во-первых, ваш оператор должен взять константную ссылку в качестве параметра:

strtype operator= (const strtype &st)

Во-вторых, оператор присваивания ожидает strtype, а не const char*.Для этого просто перегрузите другой оператор:

strtype& operator= (const char* c) {
    str = c;
    return *this;
}

Вы также хотите изменить содержимое вашего первого оператора следующим образом:

strtype& operator= (const strtype &st) {
        str = st.str;
        return *this;
    }

Это важно, поэтому при использовании оператора присваиваниячтобы присвоить новое значение объекту strtype, вы хотите, чтобы он изменял значения, а не создавал новое.Это не будет иметь эффекта.Возвращаемое значение просто в том случае, если вы объединяете несколько назначений, поэтому оно может использовать результат одного назначения для включения в следующее.

0 голосов
/ 06 октября 2018

Чтобы

strtype d = "NEWSPAPER";

работал, вы должны предоставить конструктор, принимающий char const* в качестве аргумента.

Также используйте список инициализации:конструкторы для инициализации переменных-членов вместо присваиваний в теле конструктора:

class strtype {
    string str;
public:
    strtype()
    : str{ "Test" }
    {}

    strtype(string ss)
    : str{ ss }
    {}

    strtype(char const *ss)
    : str{ ss }
    {}

    strtype& operator=(strtype const &st)  // *)
    {
        str = st.str;
        return *this;
    }
};

*) Операторы присваивания обычно должны принимать ссылки на const, а также возвращать ссылку на объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...