Рассмотрим следующий класс:
class A {
char *p;
int a, b, c, d;
public:
A(const &A);
};
Обратите внимание, что я должен определить конструктор копирования, чтобы сделать глубокую копию "p". У этого есть две проблемы:
-
Большинство полей следует просто скопировать. Копирование их по одному является уродливым и подверженным ошибкам.
-
Что еще более важно, всякий раз, когда в класс добавляется новый атрибут, необходимо обновить конструктор копирования, что создает кошмар обслуживания.
Мне бы хотелось сделать что-то вроде:
A(const A &a) : A(a)
{
// do deep copy of p
:::
}
Итак, сначала создается конструктор копии по умолчанию, а затем выполняется глубокая копия.
К сожалению, это не работает.
Есть ли лучший способ сделать это? Одно ограничение - я не могу использовать общие/умные указатели.
Предложения Sbi имеют большой смысл. Я думаю, что я займусь созданием классов-оболочек для обработки ресурса. Я не хочу, чтобы пользователь shared_ptr, поскольку библиотеки boost могут быть недоступны на всех платформах (по крайней мере, не в стандартных дистрибутивах, OpenSolaris - пример).
Я по-прежнему думаю, что было бы здорово, если бы вы могли каким-то образом заставить компилятор создать стандартные конструкторы/назначения для вас, и вы могли бы просто добавить свои функции поверх него. Созданные вручную функции конструктора/назначения экземпляра копий, которые, я думаю, будут хлопотами для создания и кошмаром для поддержания. Таким образом, мое личное эмпирическое правило заключается в том, чтобы избежать произвольных конструкторов копирования/операторов присваивания любой ценой.
Спасибо всем за их ответы и полезную информацию и жаль о опечатках в моем вопросе. Я печатал его со своего телефона.