2008-11-06 4 views
0

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

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

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

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

спасибо!

UgaSofT

+0

Вы совершенно ясны. Вы хотите, чтобы копия ctor по умолчанию была доступна для внутреннего использования, но просто не была правильной? – 2008-11-06 16:09:28

+0

Ooops ... Это должно прочитать «Вы НЕ совсем понятны». – 2008-11-06 16:10:08

ответ

3

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

Если вам действительно нужен ваш класс, чтобы иметь семантику значений, посмотрите на Idiom с буквой огибающей J.Coplien или в этой статье о Regular Objects [1].

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

НТНА,

0

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

Я столкнулся с этим в прошлом и придумал следующее решение. Класс Asumme равен C1.

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

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

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

0

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

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

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

0

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

class A 
{ 
    protected: 
     A(const A&) = default; 
};