2010-09-06 4 views
12

$ 12,8/2 - «нешаблонном конструктор для класса X является конструктор копирования, если его первый параметр имеет тип X &, сопзЬ X &, летучего X & или Const летучего X &, и либо нет других параметров или иначе все других параметров по умолчанию аргументов (8.3.6) .106)»Почему у конструктора копирования есть несколько параметров?

до сих пор я не встречал ни одного примера ситуации, когда есть необходимость объявлять ac opy с дополнительными параметрами по умолчанию.

Хотелось бы узнать какое-либо использование в режиме реального времени такого конструктора копирования, который принимает более одного параметра.

ответ

11

Старая std::basic_string действительно есть один тоже:

basic_string(const basic_string& s, 
     size_type pos = 0, size_type n = npos) 
+1

прохладный !. Я не знал об этом. Также intellisense в VS 2010 не показывает это int main() { \t строка s1 = "ПРОДАВАТЬ"; \t строка s2 (s1, 1, 3); \t s2 = "T" + s2; } – Chubsdad

+0

Просто добавьте некоторые разъяснения здесь, так как этот ответ создал немного путаницы [по этому вопросу здесь] (http://stackoverflow.com/q/32976919/1708801). Этот конструктор находится от [около 98] (http://stackoverflow.com/a/32977431/1708801), и вы не найдете много ссылок, которые охватывают это. –

+0

@Chubsdad, что подпись довольно старая, с 1998 года. –

10

The BDE allocator [PDF Link] использовал эту причуду. Например их массив Распределитель выглядел следующим образом:

template <typename T> 
class bde::Array { 
public: 
    Array(bde::Allocator *allocator = 0); 
    Array(const Array &rhs, bde::Allocator *allocator = 0); 
}; 
+1

+1 потому что это похоже на интересное чтение. –

+1

Обет !. Никогда не предполагал, что творческое использование дополнительного параметра для копирования конструктора !. Тем не менее читать полностью, хотя ... – Chubsdad

+0

@Chubs, @James: Обратите внимание, что эта реализация является эксклюзивной, позволяющей использовать разные типы распределителей. Хотя STL * должен * иметь эквивалентное содержимое-копия, конструктор assign-allocator, он будет реализован как другая функция, а не аргумент по умолчанию. – Potatoswatter

3

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

  • Копирование структуры данных, где копия будет заполняться с дополнительными данными

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

  • ли сделать глубокую копию или неполной копию элемента значения

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

  • дословного копирование против логической копии

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

0

У меня возникла ситуация, когда требуется, чтобы конструктор копирования имел более одного параметра в одном из моих классов с глубокой копией.

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

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

[Изменить]: просматривая мой код, кажется, что он еще более распространен, чем я, хотя и использую его в нескольких местах в другом месте.

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

//----------------------------------------------------------------------------- 
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).

+0

Если вы заинтересованы в smart_ptr, я знаю, был ликий умный указатель и актер (возможно, другой). у актера была одна или две небольшие ошибки, но это тот, который я использую, поскольку они предлагают почти такую ​​же функциональность для моего использования. Loki, вероятно, больше, если вы хотите использовать глубокую копию. Я думаю, что оба они, похоже, не так много добавили. – n1ckp

+0

Не знаете, почему это произошло, но я отредактировал пару орфографических ошибок и волшебные вернувшиеся строки. Weird. –

+0

@mmyers: Я думаю, что это было связано с откатом. В основном я попытался добавить информацию о глубокой копии в качестве комментария и удалил текст, затем передумал и попытался откат. Я не совсем уверен, что это откат. – n1ckp

Смежные вопросы