[英]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_list
的list_
中。
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.