浅复制类指针数组

时间:2019-03-08 23:29:35

标签: c++ arrays pointers

我正在尝试完成一个项目。

在一部分中,我必须使用复制构造函数对指向两个图片对象的指针数组进行浅表复制。

我不明白如何完成此构造函数:

#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是不正确的。我该如何解决?

2 个答案:

答案 0 :(得分:1)

(浅表副本)您想要的是:

f(JsonFile):
    # open input, output files and convert

with Pool(16) as p:
    p.map(f, os.listdir(os.getcwd()))

这将复制两个指针。

请注意,命名参数listdir会隐藏具有相同名称的实例变量。

答案 1 :(得分:0)

您的pp内存是包含2个指针的原始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;
  ...
};