Мелкое копирование массива указателей классов - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь завершить проект.

В одной части я должен использовать конструктор копирования, чтобы сделать поверхностную копию массива указателей на два объекта изображения.

Я не понимаю, как завершить этот конструктор:

#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 ]

1 голос
/ 09 марта 2019

То, что вы хотите (для мелкой копии):

Picture_Pair::Picture_Pair(const Picture_Pair& copy_from)
{
    memcpy (pp, copy_from.pp, sizeof (pp));
}

Копирует оба указателя.

Обратите внимание, что присвоение имени параметру pp скрывает переменную экземпляра с тем же именем.

0 голосов
/ 09 марта 2019

Ваша pp память - это необработанный массив в стиле C, содержащий 2 указателя. Вы не можете назначить необработанный массив непосредственно другому необработанному массиву. Вам необходимо скопировать отдельные элементы из одного массива в другой, например:

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 или более позднюю версию, поэтому вам следует рассмотреть возможность использования std::array в стиле 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;
  ...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...