Предположим, мой класс выглядит следующим образом:
class Strt {
public:
int a{0};
int b{0};
Strt(int a, int b): a(a), b(b) {}
Strt(Strt& s) {a = s.a; b = s.b;} // these two functions have same contents
Strt(Strt&& s) {a = s.a; b = s.b;}
};
Проблема в том, что инициализация левого значения и инициализация правого значения одинаковы, что делает его не чистым, поскольку, как только я захочу изменить переменные члена класса, Мне нужно изменить две функции таким же образом. Код продублирован. Как я могу сделать это чисто для лучшего чтения и обслуживания?
Редактировать:
В некоторых случаях эти функции конструирования называются:
Strt func() {return Strt(1, 2);}
vector<Strt> v;
Strt s(3, 4);
v.push_back(s); // call left construction function
v.emplace_back(func();} // call right construction function
Есть также некоторые случаи, когда необходимо изменить класс, например, когда мне нужно добавить в него новое поле int c;
:
class Strt {
public:
int a{0};
int b{0};
int c{0};
Strt(int a, int b, int c): a(a), b(b), c(c) {}
Strt(Strt& s) {a = s.a; b = s.b; c = s.c;} // The two functions are duplicatedly modified in the same way
Strt(Strt&& s) {a = s.a; b = s.b; c = s.c;}
};
Должен ли я изменять содержимое Strt(Strt&)
и Strt(Strt&&)
отдельно, даже если они имеют одинаковое содержимое?