Как бы вы поменяли эти два объекта? - PullRequest
0 голосов
/ 31 мая 2018

Недавно я столкнулся с серьезной ошибкой при работе над проектом.Мне потребовался целый день, чтобы понять, что является причиной ошибки.Оказывается, в одной библиотеке, которую я использую, есть «плохой дизайн» (должен я сказать?).

Давайте предположим, что у нас есть этот foo класс:

struct foo {
  inline foo(int& i) : i_(i) { }

  inline foo& operator=(const foo& that) {
    if (this != &that) {
      i_ = that.i_;
    }
    return *this;
  }

  inline
  friend std::ostream& operator<<(std::ostream& os, const foo& f) {
    os << f.i_;
    return os;
  }

  private:
    foo();
    int& i_;
};

И здесьэто пример использования foo:

#include <iostream>
#include <utility>


int main(int argc, char** argv) {
  int x = 10;
  int y = 100;

  foo f1(x);
  foo f2(y);

  std::cout << "before swapping" << std::endl;

  std::cout << "x = " << x << std::endl;
  std::cout << "y = " << y << std::endl;
  std::cout << "f1 = " << f1 << std::endl;
  std::cout << "f2 = " << f2 << std::endl;

  std::swap(f1, f2);

  std::cout << "after swapping" << std::endl;

  std::cout << "x = " << x << std::endl;
  std::cout << "y = " << y << std::endl;
  std::cout << "f1 = " << f1 << std::endl;
  std::cout << "f2 = " << f2 << std::endl;

  return 0;
}

И результат:

before swapping
x = 10
y = 100
f1 = 10
f2 = 100
after swapping
x = 100
y = 100
f1 = 100
f2 = 100

Я прошу прощения, если кто-то уже публиковал этот вопрос раньше, если это так, пожалуйста, дайте мне знатьЯ удалю это сообщение.

Если никто раньше не упоминал / не сталкивался с этой проблемой, пожалуйста, позвольте мне поднять ее до:

  1. Спроситьесли бы кто-то мог придумать решение, чтобы поменять местами эти два foo объекта.

  2. Напомнить мне / другим, что std::swap не является универсальным решением для всех.Так что используйте его с осторожностью!

Спасибо!

...