Написание конструктора копирования для класса на C ++, у которого есть набор, содержащий указатели - PullRequest
0 голосов
/ 01 августа 2020

Допустим, у вас есть класс на C ++, как показано ниже:

template<typename T>
class my_class {
public:
private:
  std::set<T*> class_set;
  int elements_in_set;
}

Я пытаюсь написать конструктор копирования для этого класса, и пока я застрял в следующем, где я знаю только как скопировать целое число elements_in_set, но я не уверен, как скопировать через набор и сделать глубокую копию того, на что указывают другие class_set указатели:

my_class(my_class const& other)
: class_set{}, elements_in_set{other.elements_in_set} {
  //don't know how to copy over the set
}

Я знаю, что если класс имеет указатель в качестве члена, вы должны использовать new data type[size of data pointer points to], но нужно ли вызывать new, чтобы создать сам набор, а затем new для каждого указателя в наборе? Любая помощь будет принята с благодарностью. Также было бы неплохо, если бы существовал способ сделать это, используя стандартные библиотечные алгоритмы, а не for циклы.

1 Ответ

2 голосов
/ 01 августа 2020

Зависит. Вам нужна мелкая или глубокая копия?

Для неглубокой копии (оба экземпляра my_class используют одни и те же объекты T) просто скопируйте набор таким же образом, как и член int.

Для глубокой копии (новые экземпляры получают свою собственную копию объектов T) вам необходимо пройти через исходный набор, создать новый T и вставить его в новый набор. Если в наборе всего T объектов, с помощью new будет работать. Если T является базовым классом, вам придется добавить функцию клонирования.

Обратите внимание, что наличие указателя в наборе, по крайней мере, немного необычно. Если вам нужно второе поведение (глубокая копия) с использованием значений вместо указателей, это даст вам это бесплатно.

Изменить: обратите внимание, что ваш член int является избыточным. Набор учитывает его размер.

...