我正在努力完成一个项目。
在一个部分中,我必须使用复制构造函数来制作指向两个图片对象的指针数组的浅表副本。
我不明白如何完成这个构造函数:
#ifndef PICTURE_PAIR_H
#define PICTURE_PAIR_H
class Picture; // Forward declaration. Picture
// is used in general constructor
class Picture_Pair
{
private:
Picture* pp[2] {nullptr, nullptr}; // Pointers to the two Pictures
Picture_Pair::Picture_Pair(const Picture_Pair& pp)
{
pp=pp.pp;
}
我知道pp=pp.pp
不对。我该如何解决?
你想要的(浅层副本)是:
Picture_Pair::Picture_Pair(const Picture_Pair& copy_from)
{
memcpy (pp, copy_from.pp, sizeof (pp));
}
这复制了两个指针。
请注意,命名参数pp
会隐藏同名的实例变量。
你的pp
内存是一个原始的C风格的数组,有两个指针。您不能将原始数组直接分配给另一个原始数组。您需要将单个元素从一个数组复制到另一个数组,例如:
Picture_Pair::Picture_Pair(const Picture_Pair& src)
{
pp[0] = src.pp[0];
pp[1] = src.pp[1];
}
要么:
Picture_Pair::Picture_Pair(const Picture_Pair& src)
{
for(int i = 0; i < 2; ++i)
pp[i] = src.pp[i];
}
要么:
#include <algorithm>
Picture_Pair::Picture_Pair(const Picture_Pair& src)
{
std::copy(src.pp, src.pp+2, pp);
}
要么:
#include <algorithm>
Picture_Pair::Picture_Pair(const Picture_Pair& src)
{
std::copy_n(src.pp, 2, pp);
}
但是,您实际上不需要为Picture_Pair
类定义复制构造函数或赋值运算符,默认实现将足以为您浅层复制数组:
class Picture_Pair
{
private:
Picture* pp[2]{nullptr, nullptr};
...
public:
...
Picture_Pair(const Picture_Pair&) = default;
...
Picture_Pair& operator=(const Picture_Pair&) = default;
...
};
虽然,你显然使用C ++ 11或更高版本,所以你应该考虑使用C ++风格的std::array
而不是原始的C风格数组:
#include <array>
class Picture_Pair
{
private:
std::array<Picture*, 2> pp{nullptr, nullptr};
...
public:
...
Picture_Pair(const Picture_Pair&) = default;
...
Picture_Pair& operator=(const Picture_Pair&) = default;
...
};