Конструктор инициализируется функцией return - PullRequest
0 голосов
/ 04 июня 2018

Я не могу понять, почему я не могу инициализировать мой объект класса в одну строку, как показано ниже.Получение ошибок VS, которые не являются простыми для меня:

"ошибка: класс E0334" пример "не имеет подходящего конструктора копирования"

и

"C2440" инициализация ": невозможнопреобразовать «пример» в «пример» "

Какой-то код:

class example {
public:
    example() { R = 0.F; I = 0.F; };
    example(float, float);
    example(example &);
    example sum( float, float);
private:
    float R, I;
};

example::example(float s1, float s2):R(s1), I(s2) {}

example::example(example & ex2) {
    R = ex2.R;
    I = ex2.I;
}

example example::sum(float s1, float s2){
    example s;
    s.R = s1;
    s.I = s2;
    return s;
}

int main() {
    float a = 2;
    float b = 4;
    example object1(1,1);
    example object2(object1.sum(a,b));
    return 0;
}

Зачем инициализировать object2 так:

example object2(object1.sum(a,b));

получаю ошибку, но что-токак это:

example object2;
object2 = (object1.sum(a,b));

пройти без ошибки, это нормально?

Ответы [ 2 ]

0 голосов
/ 04 июня 2018

Вам не хватает const в конструкторе копирования

example(example const &);

Почему при инициализации объекта2 происходит следующее:

example object2(object1.sum(a,b));

получая ошибку

Поскольку вы не можете получить неконстантную ссылку из rvalue object1.sum(a,b).

, но что-то вроде этого:

example object2;
object2(object1.sum(a,b));

это нормально?

Этот код также неверен, вторая строка потребует operator ().

0 голосов
/ 04 июня 2018
example object2(object1.sum(a,b));

это не конструктор копирования, это конструктор перемещения, потому что аргумент равен rvalue.

, поэтому вы можете явно добавить конструктор перемещения следующим образом.1007 *

example object2;
object2 = (object1.sum(a,b));

нормально, потому что он вызовет оператор присваивания копии, который компилятор генерирует автоматически (когда вы добавляете конструктор перемещения, как я, компилятор не будет генерировать оператор присваивания копии)

...