提问人:Anon 提问时间:10/17/2018 最后编辑:Anon 更新时间:10/17/2018 访问量:1720
指向对象的指针数组的 C++ 复制构造函数
C++ Copy Constructor for array of pointers to objects
问:
我创建了一个类,其中包含大小和 Rectangle **a 类型的数组。下面的初始化是否正确:
C(int size = 1, Rectangle **a = new Rectangle *[1]);
对于复制构造函数,我已经尝试过这个(编辑:不知道如何完成将数组的每个指针复制到副本中,因为每个元素也是一个 指针):
C ( const C & other) : size{other.size}, a{size ? new Rectangle[size] : nullptr}
{
// ....
}
答:
2赞
Alan Birtles
10/17/2018
#1
让标准库为您完成工作。使用起来会更安全、更简单、更可靠。std::vector<Rectangle>
为了回答您的问题,不,您的复制构造函数不正确,因为它只创建一个相同大小的新数组,并且不会将现有元素复制到其中。
评论
0赞
Anon
10/17/2018
忘了提我不能使用向量来解决这个问题
1赞
Alan Birtles
10/17/2018
@Anon为什么呢?如果你不能使用,那么你几乎必须实现自己来处理各种边缘情况std::vector
std::vector
0赞
pokey909
10/17/2018
#2
为避免永久性脑损伤,请作为成员使用。std::vector<Rectangle>
class C {
public:
C(const std::vector<Rectangle> &rectangles) : m_rectangles(rectangles) {}
C(const C &other) : m_rectangles(other.m_rectangles) {}
private:
std::vector<Rectangle> m_rectangles;
};
评论
0赞
Eljay
10/17/2018
由于复制构造函数是冗余的,因此对于那些喜欢显式的人来说,可以这样编写自文档代码:C(C const&) = default;
0赞
Charlie
10/23/2018
同样在这里,在这个特定示例中,您真正想要的构造函数是C(std::vector<Rectangle> rectangles) : m_rectangles(std::move(rectangles)) {}
0赞
YSC
10/17/2018
#3
您需要遵守 0/3/5 的规则。
零规则状态:
具有自定义析构函数、复制/移动构造函数或复制/移动赋值运算符的类应专门处理所有权(遵循单一责任原则)。其他类不应具有自定义析构函数、复制/移动构造函数或复制/移动赋值运算符。
#include <vector>
struct Rectangle {};
class C
{
std::vector<Rectangle> _v; // no memory management from C
public:
size_t size() const { return _v.size(); }
Rectangle & operator()(size_t index) { return _v[index]; }
Rectangle const& operator()(size_t index) const { return _v[index]; }
};
如果由于某种原因您需要手动管理资源,则 3 和 5 的规则将生效。
在 C++98 中,三种状态的规则:
如果一个类需要用户定义的析构函数、用户定义的复制构造函数或用户定义的复制赋值运算符,那么它几乎可以肯定需要这三个运算符。
在 C++11 及更高版本中,五法则取代了它:
由于用户定义的析构函数、复制构造函数或复制赋值运算符的存在阻止了移动构造函数和移动赋值运算符的隐式定义,因此任何需要移动语义的类都必须声明所有五个特殊成员函数
struct Rectangle {};
struct C
{
size_t _size;
Rectangle* _data;
C() : _size(0), _data(nullptr) {}
C(size_t size) : _size(size), _data(_size == 0 ? nullptr : new Rectangle[_size]) {}
C(C const& other) : _size(other._size), _data(_size == 0 ? nullptr : new Rectangle[_size])
{
std::copy(_data, other._data, other._data + _size);
}
C& operator=(C const& other)
{
C self = other; // copy construction
using std::swap;
swap(*this, self);
return *this;
}
// if necessary: move constructor and move assignment operator
~C() { delete _data; }
};
评论
0赞
Anon
10/17/2018
我可以使用 copy 复制所有元素,即使每个元素都是指向新矩形的指针吗?在此之后,我正在实施复制分配,谢谢:)
0赞
YSC
10/17/2018
如果需要 2D 容器,请使用基础 1D 向量或数组并重载 。operator()(size_t x, size_t y)
评论
which is giving me errors
当您收到错误时,第一步是阅读错误消息。