Сделайте созданный объект снова равным другому

У меня есть два объекта (а и б) изначально, и б = а. Некоторые операции выполняются над a, и мне интересно, как я могу снова сделать b = a.

Например,

int main()
{
A a;
a.some_ops();
/// I to create a new object and make it equal to a
A b = a;
b.some_ops();

a.other_ops();
/// Now I want to make b = a again
b = a; // BUG, this will not work, right?
}

Спасибо за ваше время.

0

Решение

C ++ генерирует оператор присваивания по умолчанию для каждого class который присваивает элемент экземпляра по элементу (используя операторы присваивания классов / типов элементов).

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

Я немного обогатил пример кода OP:

#include <iostream>

class A {
private:
int _mem1, _mem2;
public:
A(): _mem1(0), _mem2(0) { }
A(const A&) = default;
A& operator=(const A&) = default;
void some_ops() { ++_mem1; }
void other_ops() { ++_mem2; }

friend std::ostream& operator << (std::ostream &out, const A &a)
{
return out << "mem1: " << a._mem1 << ", mem2: " << a._mem2;
}
};

int main()
{
std::cout << "A a;\n"; A a;
std::cout << "a: " << a << '\n';
std::cout << "a.some_ops;\n"; a.some_ops();
std::cout << "a: " << a << '\n';
/// I to create a new object and make it equal to a
std::cout << "A b = a;\n"; A b = a;
std::cout << "a: " << a << ", b: " << b << '\n';
std::cout << "b.some_ops();\n"; b.some_ops();
std::cout << "a: " << a << ", b: " << b << '\n';

std::cout << "a.other_ops();\n"; a.other_ops();
std::cout << "a: " << a << ", b: " << b << '\n';
/// Now I want to make b = a again
std::cout << "b = a;\n"; b = a; // BUG, this will not work, right? <= It should.
std::cout << "a: " << a << ", b: " << b << '\n';
return 0;
}

Выход:

A a;
a: mem1: 0, mem2: 0
a.some_ops;
a: mem1: 1, mem2: 0
A b = a;
a: mem1: 1, mem2: 0, b: mem1: 1, mem2: 0
b.some_ops();
a: mem1: 1, mem2: 0, b: mem1: 2, mem2: 0
a.other_ops();
a: mem1: 1, mem2: 1, b: mem1: 2, mem2: 0
b = a;
a: mem1: 1, mem2: 1, b: mem1: 1, mem2: 1

Живая Демо на Колиру


Первый пример кода — с перегруженным конструктором копирования и оператором присваивания:

#include <iostream>

class A {
private:
int _mem1, _mem2;
public:
A(): _mem1(0), _mem2(0) { }
A(const A &a):
_mem1(a._mem1), _mem2(a._mem2)
{
std::cout << "A::A(const A&) called\n";
}
A& operator=(const A &a)
{
_mem1 = a._mem1; _mem2 = a._mem2;
std::cout << "A& A::operate=(const A&) called\n";
return *this;
}
void some_ops() { ++_mem1; }
void other_ops() { ++_mem2; }

friend std::ostream& operator << (std::ostream &out, const A &a)
{
return out << "mem1: " << a._mem1 << ", mem2: " << a._mem2;
}
};

int main()
{
std::cout << "A a;\n"; A a;
std::cout << "a: " << a << '\n';
std::cout << "a.some_ops;\n"; a.some_ops();
std::cout << "a: " << a << '\n';
/// I to create a new object and make it equal to a
std::cout << "A b = a;\n"; A b = a;
std::cout << "a: " << a << ", b: " << b << '\n';
std::cout << "b.some_ops();\n"; b.some_ops();
std::cout << "a: " << a << ", b: " << b << '\n';

std::cout << "a.other_ops();\n"; a.other_ops();
std::cout << "a: " << a << ", b: " << b << '\n';
/// Now I want to make b = a again
std::cout << "b = a;\n"; b = a; // BUG, this will not work, right? <= It should.
std::cout << "a: " << a << ", b: " << b << '\n';
return 0;
}

Выход:

A a;
a: mem1: 0, mem2: 0
a.some_ops;
a: mem1: 1, mem2: 0
A b = a;
A::A(const A&) called
a: mem1: 1, mem2: 0, b: mem1: 1, mem2: 0
b.some_ops();
a: mem1: 1, mem2: 0, b: mem1: 2, mem2: 0
a.other_ops();
a: mem1: 1, mem2: 1, b: mem1: 2, mem2: 0
b = a;
A& A::operate=(const A&) called
a: mem1: 1, mem2: 1, b: mem1: 1, mem2: 1

Живая Демо на Колиру

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector