copy — Клонирование объекта в C ++ с точным дублированием (набор данных после построения)

Есть ли быстрый способ сделать точную копию существующего объекта в C ++?

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

Я слышал, что в c ++ есть конструктор копирования, но я не уверен, как его использовать, и не знаю, подходит ли он моей ситуации. Есть ли удобный способ сделать это, кроме копирования всех данных вручную?

РЕДАКТИРОВАТЬ:
У меня есть много пользовательских типов в этом объекте (графики и т. Д. Сложные вещи)

1

Решение

Если ваши члены являются POD-типами или сами являются копируемыми, тогда компилятор сгенерирует конструктор копирования по умолчанию.

class Foo
{
public:
Foo(int x, int y, int z, const std::string& name)
: x_(x), y_(y), z_(z), name_(name)
{
}

private:
int x_, y_, z_;
std::string name_;
};

Этот пример класса можно скопировать с помощью конструктора копирования по умолчанию. Следующее все правильно:

Foo a(1, 2, 3, "four");

// copy construct b from a, using the compiler provided default copy constructor
Foo b(a);

Foo c(5, 6, 7, "eight");

// copy c from b, c's current values are "lost"c = b;

Если у вас есть класс, который содержит пользовательские типы, которые не работают должным образом с мелкой копией, то вам нужно будет написать свой собственный конструктор копирования, оператор присваивания и деструктор. Вот почему большинство опытных разработчиков C ++ будут по возможности избегать необработанных указателей (и других подобных концепций).

class BadFoo
{
public:
BadFoo() : x_(new int(5))
{
}

// ... You need to manage the memory of x_ on your own
// This means following the rule of 3 (C++03) or 5 (C++11)

private:
int* x_;
};

Увидеть: Правило трех

1

Другие решения

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

Однако не забывайте, что когда вы решите реализовать конструктор копирования, это признак того, что вам, скорее всего, потребуется реализовать оператор копирования-назначения, а также деструктор. Обычно это называется Правило трех в C ++.

1

Копировать конструктор это путь.

class MyObject
{
public:
MyObject(const MyObject& other);
private:
int x;
float y;
std::string s;
}
MyObject::MyObject(const MyObject& other)
: x(other.x), y(other.y), s(other.s)
{}

см другие примеры здесь

0

Вы должны определить процесс копирования вручную. Как еще узнает компилятор, если вы повторно используете тот же ресурс или хотите получить копию этого ресурса?

Конструктор копирования по умолчанию (который всегда есть, если вы не определите свой собственный) скопирует все данные простым присваиванием, что может быть вредно для указателей, файлов, соединения и всех других внешних ресурсов.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector