Рассмотрим следующий класс:Создание легко поддерживать конструктор копирования
class A {
char *p;
int a, b, c, d;
public:
A(const &A);
};
Заметьте, что я должен определить конструктор копирования для того, чтобы сделать глубокую копию «р». Это имеет два вопроса:
Большинство полей следует просто скопировать. Копирование их по одному является уродливым и подверженным ошибкам.
Что еще более важно, всякий раз, когда к классу добавляется новый атрибут, необходимо обновить конструктор копирования, что создает кошмар для обслуживания.
Я бы лично хотел бы сделать что-то вроде:
A(const A &a) : A(a)
{
// do deep copy of p
:::
}
Так конструктор копирования по умолчанию называется первым, а затем глубокая копия выполняется.
К сожалению, это не работает.
Есть ли лучший способ сделать это? Одно ограничение - я не могу использовать общие/умные указатели.
Предложения Sbi имеют большой смысл. Я думаю, что я займусь созданием классов-оболочек для обработки ресурса. Я не хочу, чтобы пользователь shared_ptr, поскольку библиотеки boost могут быть недоступны на всех платформах (по крайней мере, не в стандартных дистрибутивах, OpenSolaris - пример).
Я по-прежнему считаю, что было бы здорово, если бы вы могли каким-то образом заставить компилятор создать стандартные конструкторы/назначения для вас, и вы могли бы просто добавить свои функции поверх него. Созданные вручную функции конструктора/назначения экземпляра копий, которые, я думаю, будут хлопотами для создания и кошмаром для поддержания. Поэтому мое личное эмпирическое правило будет заключаться в том, чтобы избежать произвольных конструкторов копирования/операторов присваивания любой ценой.
Спасибо всем за их ответы и полезную информацию, и жаль, что опечатки в моем вопросе. Я печатал его со своего телефона.
Почему вы не можете использовать интеллектуальные указатели? – 2010-07-07 07:34:56
@Neil: Возможно, у его клавиатуры нет подчеркивания? – fredoverflow
Все ответы до сих пор сосредоточены на том, что вам не нужна специальная копия c'tor. Но вопросительная часть вопроса, поднятая здесь, заключается в следующем: возможно ли сохранить некоторые автоматически создаваемые функциональные возможности и просто расширить его (не ограничиваясь только указанием на указатель). –