【问题标题】:copy constructor of a vector-derived class矢量派生类的复制构造函数
【发布时间】:2013-02-26 10:26:58
【问题描述】:

我有以下课程。

class CA {
...
};

class CB: public vector<CA> {
...
};

我应该如何实现CB的复制构造函数?即,

CB(CB& cb).

如何将cb的向量的内容复制进去?

【问题讨论】:

  • 请不要派生标准容器。
  • @LightnessRacesinOrbit:派生std::vector 有什么问题?我记得我这样做时的一种情况,只是为了向我的向量中添加一些额外的数据成员......
  • @LihO,标准容器析构函数不是虚拟的,如果您通过基类指针将其删除,则可能是 UB。所以你可以这样做,但你必须非常小心。
  • @LihO 私有继承会相当安全,除了它允许您访问基类的受保护方法,这可能是不受欢迎的。见this gotw
  • @LihO 我以前也见过这样的代码,而且效果很好。这就是为什么我这样实现我的程序的原因。你知道如何实现复制构造函数吗?还是应该在创建向量后复制向量的每个元素?

标签: c++ vector constructor copy-constructor


【解决方案1】:

忽略从std::vector 公开继承的问题,如果您确实需要派生类型的复制构造函数(例如,如果您正在管理动态分配的资源),那么您可以使用构造函数初始化列表,如在此示例中,Foo 在继承层次结构中取代了您的 std::vector

#include <iostream>

struct Foo
{
  Foo() {}
  Foo(const Foo&) { std::cout << "Copy Foo\n";}
};

struct Bar : public Foo
{
  Bar() {}
  Bar(const Bar& b) : Foo(b) {}
};

int main()
{
  Bar b1;
  Bar b2(b1);
}

【讨论】:

  • 对于vector,会是这样吗?即CB(const CB&amp; cb): vector&lt;CA&gt;(cb) {}
  • @jason.Z 是的,矢量也不例外。它有有用的复制构造函数等等。
  • @jason.Z 看起来不错。应该很容易写一个小测试。
  • 之前还在为初始化列表发愁,vector&lt;CA&gt;(cb)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-07
  • 2013-06-23
  • 2011-10-10
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多