Сделайте созданный объект снова равным другому - PullRequest
0 голосов
/ 29 июня 2018

У меня есть два объекта (a и b) изначально, и b = a. Некоторые операции выполняются над 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?
}

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

1 Ответ

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

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

Демонстрация в реальном времени на coliru


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

#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

Демонстрация в реальном времени на coliru

...