繁体   English   中英

c++ 子复制构造函数不保存成员变量

[英]c++ child copy constructor not saving member variable

我只想为派生的 class 创建复制构造函数,如下所示:

  template <typename T>  
  class base_list {
  public:
    base_list() noexcept = default;

    base_list(std::initializer_list<T> il)
    : list_{il} {}

    friend auto operator<<(std::ostream& os, base_list const& sl) -> std::ostream& {
      if (sl.list_.size() == 0) {
        return os;
      }
      for (auto const& element : sl.list_) {
        os << '|' << element;
      }
      os << '|';
      return os;
    }

    auto get_list() const -> std::list<T> {
      return list_;
    }

  private:
    std::list<T> list_;
  };


  template <typename T>
  class derived_list : public base_list<T> {
  public:
    derived_list(std::initializer_list<T> il) : base_list<T>(il) {};

    explicit derived_list(base_list<T> const& other) {
      list_ = other.get_list();

      for (auto const& element : list_) {
        std::cout << "ELEMENT: " << element << '\n';
      }
    }

  private:
      std::list<T> list_;
  };

我正在使用下面的代码对其进行测试。

    auto bl = q2::base_list<double>{ 1.0, 1.5, 2.0 };
    auto dl = q2::derived_list<double>(bl);
    auto out = std::ostringstream{};
    out << dl;
    auto const expected_output = std::string{"|1|1.5|2|"};
    CHECK(out.str() == expected_output);

可以看到循环中显示的元素,但测试失败,显示列表为空......为什么数据没有保存在 list_ 中? 谢谢

ELEMENT: 1
ELEMENT: 1.5
ELEMENT: 2

....

FAILED:
  CHECK( out.str() == expected_output )
with expansion:
  "" == "|1|1.5|2|"

这里发生的事情有点类似于老式的抢椅游戏。

你有一个

std::list<T> list_;

这被声明为base_list的私有成员。 作为额外的奖励,你还有一个

std::list<T> list_;

这被声明为derived_list的私有成员。 他们碰巧有相同的名字,但他们之间绝对没有任何关系。 这与声明std::list<T> a;完全相同。 合二为一, std::list<T> b; 在另一个。 仅仅因为它们具有相同的名称并不意味着它们是相同的 object,它们不是,C++ 不能以这种方式工作。 Each class is fully responsible for its class members, and whatever happens in some other class it's derived from, or which derives from it, does not affect it's own class members. 他们是两个不同的班级。 这里有两个不同list_对象,每个都是其 class 的私有成员。

如此混乱,有两个班级成员,同名。 所以,最终的结果是一场抢椅游戏:价值列表实际上会在哪里结束?

auto bl = q2::base_list<double>{ 1.0, 1.5, 2.0 };

这构造了一个base_list ,值最终出现在base_listlist_中。

auto dl = q2::derived_list<double>(bl);

这构造了一个derived_list ,并将list_中的base_list复制到list_中的derived_list 抢椅游戏开始了。 目前:

base_list::list_为空。

derived_list::list_包含值。

out << dl;

这调用了base_list中的operator<<重载,它尽职尽责地将自己的空list_显示为这场抢椅子游戏的结论。

构造函数实际上是“保存成员变量”。 问题是<<重载正在查看与另一个变量无关的完全不同的变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM