Есть ли способ объявить конструктор копирования закрытым И использовать конструктор копирования по умолчанию? - PullRequest
0 голосов
/ 06 ноября 2008

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

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

Я не хочу объявлять защищенное назначение копирования и конструкцию И определять их (и поддерживать синхронизацию с изменениями), если у меня нет особых действий.

Кто-нибудь знает, есть ли другой способ?

спасибо!

UgaSofT

Ответы [ 4 ]

3 голосов
/ 06 ноября 2008

Объект из полиморфной иерархии и с семантикой значения? Что-то здесь не так.

Если вам действительно нужен класс, чтобы иметь семантику значений, взгляните на идиому Envelop-Letter J.Coplien или на эту статью о регулярных объектах [1].

[1] Шон Родитель. «Вне объектов». Понимание программного обеспечения, которое мы пишем. http://stlab.adobe.com/wiki/index.php/Papers_and_Presentations. C ++ Соединения. Ноя 2005 г.

НТН,

0 голосов
/ 04 августа 2011

Если вы можете использовать C ++ 0x ...

class A
{
    protected:
        A(const A&) = default;
};
0 голосов
/ 06 ноября 2008

Может быть, я нашел решение ...

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

Есть возражения?

0 голосов
/ 06 ноября 2008

Я не думаю, что в языке C ++ есть что-то, что позволяет вам это делать. Хотя я бы хотел ошибиться в этом вопросе.

Я сталкивался с этим в прошлом и придумал следующее решение. Асумм класс С1.

  1. Определить закрытый внутренний класс с именем Data
  2. Поместите всех моих членов, которых я бы делаю, в C1 на Данные вместо
  3. Определите конструктор защищенной копии, который просто копирует экземпляры данных между C1.

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

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

...