首页 > 解决方案 > 你将如何交换这两个对象?

问题描述

最近我在做一个项目时遇到了一个严重的错误。我花了一整天的时间才弄清楚是什么导致了这个错误。事实证明,我使用的一个库中有“糟糕的设计”(我应该说?)。

假设我们有这个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不是一刀切的解决方案。所以请谨慎使用!

谢谢!

标签: c++swap

解决方案


推荐阅读