Может кто-нибудь сказать мне, сделал ли я глубокую или желтоватую копию?
Вы сделали оба / или ... в зависимости от того, какой уровень косвенности вы рассматриваете.
Конструктор копирования std::vector
делает глубокое копирование.То есть: вектор customersList
в исходном объекте и вектор customersList
в построенном объекте ссылаются на разные внутренние буферы.Если вы добавите указатель на один, он не будет автоматически отражен в другом векторе.
Однако элементы внутри вектора являются указателями.Указатели имеют одинаковые значения и указывают на одинаковые объекты Customer
, а объекты Customer
не были скопированы.Таким образом, копия мелкая.
Оба показанных вами предложения имеют одинаковый результат, но последний лучше, потому что он выполняет только одну операцию с вектором (построение копии), а не три (построение по умолчанию длячлен, копия конструкции местного, копия назначения участника).Если функциональность правильная, еще более простой способ добиться того же - использовать неявно сгенерированный конструктор копирования: Table(const Table& t) = default;
Он делает то же самое, за исключением того, что к элементам обращаются напрямую, а не через функции-члены.
Но действительно,вам нужно тщательно продумать, что вы хотите скопировать.Вам нужны копии Customer
объектов?Затем вам нужен собственный конструктор копирования, который инициализирует эти Customer
объекты.Если вы это сделаете, то вам, вероятно, следует использовать вектор умных указателей, а не голые указатели (при условии, что вам вообще нужны указатели).
Я хотел создать еще один вектор, который будет содержать новыеуказатель - новое выделение памяти, но с теми же данными.Другими словами, я хочу скопировать данные в новую память и сохранить новые указатели в поле CustomersList.
В этом случае ваш конструктор копирования не будет выполнять то, что вы хотите.У вас есть новые указатели, у которых нет новых значений, и нет выделения памяти для объектов заказчика (хотя есть выделение памяти для вектора).
Как я могу это сделать?
Вы можете написать цикл, который перебирает вектор, который должен быть скопирован.Внутри цикла вы можете выделить новые объекты клиентов и скопировать инициализировать их с теми, которые указаны вектором.Затем вставьте указатель вновь выделенного указателя на конструируемый вектор-член.
Обратите внимание, что указатели в этом случае будут принадлежать.Вы никогда не должны иметь голые указатели.Для повторения: в этом случае вы должны использовать умные указатели (при условии, что вам вообще нужны указатели).