У меня возникла ситуация, когда требуется, чтобы конструктор копирования имел более одного параметра в одном из моих классов с глубокой копией.
В основном проблема заключается в том, что объект содержит другой объект, который должен отслеживать его с помощью указателя, но нормальная глубокая копия копирует только значение указателя, а не правильное расположение памяти нового объекта.
Отключив обычный конструктор копирования и используя вариант с двумя параметрами, я могу правильно скопировать свой объект.
[Изменить]: просматривая мой код, кажется, что он еще более распространен, чем я, хотя и использую его в нескольких местах в другом месте.
Вот пример кода для любознательных (это упрощенная версия, и на самом деле немного сложнее)
//-----------------------------------------------------------------------------
scan_point::scan_point(scan_point const& rhs, simulation* sim_)
: m(rhs.m), sim(sim_)
//-----------------------------------------------------------------------------
{
}
-
simulation_(simulation_ const& rhs)
{
//...
for(typename ContainerType::const_iterator it = rhs.spContainer->begin(), endIt = rhs.spContainer->end();
it != endIt; it++)
{
spContainer->push_back(new scan_point(*it, this));
}
}
-
Для производителей вещи, которые менее болезненны во время копирования. Я использую класс smart_ptr, который допускает глубокую копию и (в этом случае конкретно) встраивает мои члены в структуру, чтобы компилятор автоматически генерировал копирование примерно для всех o (см. пример для примера: https://stackoverflow.com/questions/469696/what-is-your-most-useful-c-c-utility/1609496#1609496).
прохладный !. Я не знал об этом. Также intellisense в VS 2010 не показывает это int main() { \t строка s1 = "ПРОДАВАТЬ"; \t строка s2 (s1, 1, 3); \t s2 = "T" + s2; } – Chubsdad
Просто добавьте некоторые разъяснения здесь, так как этот ответ создал немного путаницы [по этому вопросу здесь] (http://stackoverflow.com/q/32976919/1708801). Этот конструктор находится от [около 98] (http://stackoverflow.com/a/32977431/1708801), и вы не найдете много ссылок, которые охватывают это. –
@Chubsdad, что подпись довольно старая, с 1998 года. –