C++ 浅层复制类指针数组

C++ 浅层复制类指针数组,c++,arrays,pointers,C++,Arrays,Pointers,我正在努力完成一个项目 在一部分中,我必须使用复制构造函数来创建指向两个图片对象的指针数组的浅层副本 我不明白如何完成此构造函数: #ifndef PICTURE_PAIR_H #define PICTURE_PAIR_H class Picture; // Forward declaration. Picture // is used in gen

我正在努力完成一个项目

在一部分中,我必须使用复制构造函数来创建指向两个图片对象的指针数组的浅层副本

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

#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

我知道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];
}
或:

虽然,你很清楚的使用C++ 11或更高版本,所以你应该考虑使用C++风格而不是原始的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;
  ...
};

复制指针很快会导致失去所有权。您可能已经开始使用STL了,就像引用计数共享指针一样:将参数命名为与成员相同的参数肯定会带来麻烦。非常感谢您的回答。我现在更了解如何对数组使用浅层复制。在这种情况下,std::copy\n将是更正确和首选的解决方案,编译器可以将其优化为与memcpy等效的可复制类型。
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);
}
class Picture_Pair
{
private:
  Picture* pp[2]{nullptr, nullptr};
  ...
public:
  ...
  Picture_Pair(const Picture_Pair&) = default;
  ...
  Picture_Pair& operator=(const Picture_Pair&) = default;
  ...
};
#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;
  ...
};