в C ++, как дать конструктору копии класса и оператору присваивания одинаковые функции без дублирования кода

Возможные дубликаты:
Что такое копия- идиома подкачки?
Перегрузка конструктора копирования и оператора = в C ++: возможна ли общая функция?

Можно ли сделать так, чтобы тело конструктора копирования и оператора присваивания содержало один и тот же код без фактического дублирования кода (за исключением заголовков функций)?


person Matt Munson    schedule 22.02.2011    source источник
comment
Конечно: stackoverflow.com/questions / 3279543 ​​/   -  person GManNickG    schedule 22.02.2011
comment
Не дубликат. Другой вопрос - ответ на этот.   -  person Edward Strange    schedule 22.02.2011
comment
@Crazy: В этом суть дубликатов. Вопрос не в том, что другой вопрос решает ту же проблему. Как бы вы ответили на этот вопрос? Повторять информацию, содержащуюся в другом, а это было бы расточительно.   -  person GManNickG    schedule 22.02.2011
comment
Это не дубликат. Во всяком случае, ответ на вопрос, что такое идиома копирования и обмена? должен быть здесь.   -  person FreelanceConsultant    schedule 26.08.2015


Ответы (3)


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

person Pablo    schedule 22.02.2011

Создать функцию

    init(various parameters you need){
...
//common initializing process
}

затем вызовите эту функцию из всех ваших конструкторов, операторов копирования и присваивания

person Jason Rogers    schedule 22.02.2011

Поместите функциональность в отдельный метод, а затем вызовите его как из конструктора копирования, так и из кода оператора присваивания.

В качестве альтернативы вы можете просто вызвать свой оператор присваивания из конструктора копирования.

person Jonathan Wood    schedule 22.02.2011
comment
Оба метода останавливают инициализацию конструктора копирования (скорее, он назначает), и ни один из них не является безопасным в отношении исключений. - person GManNickG; 22.02.2011
comment
@GMan: ?? Конструктор копирования должен сначала инициализировать себя до известного состояния. Я не уверен, что понимаю ваше возражение, если он затем вызывает оператор присваивания. - person Jonathan Wood; 22.02.2011
comment
@Jonathan: подумайте, не может ли один из членов быть сконструирован по умолчанию. - person GManNickG; 22.02.2011
comment
Я вижу, что использование метода замены копии было бы предпочтительным выбором для тяжелого программирования. Но я думаю, что решение Джонатана приятно как простой легкий подход, а также отражает суть того, как проблема решается в целом. - person Matt Munson; 22.02.2011
comment
@Matt: Копирование и обмен - это не совсем так. Если вы обнаружите, что это слишком много, возможно, C ++ вам не подходит. - person GManNickG; 22.02.2011
comment
.... и он выбирает худший из возможных ответов. - person Edward Strange; 22.02.2011
comment
Я проголосовал за все ответы, потому что думал, что все они хороши. Как начинающий программист, которого в основном интересуют другие области, я изучаю этот материал постепенно, так как мне нужна информация. Я знаю, что такой подход, вероятно, не одобряется, но это реальность моей ситуации, как человека, который может уделять только определенное количество времени овладению мастерством. - person Matt Munson; 22.02.2011
comment
@GMan: процент случаев, когда невозможно установить все в известное состояние до вызова оператора присваивания, настолько мал, что ваше внимание к нему кажется подозрительным. @ Сумасшедший Эдди: Есть три ответа, два одинаковых. Как один из двоих мог быть худшим? @Matt: Не обращайте внимания на людей на SO, которые, кажется, должны что-то доказывать. Есть придурки, но есть и люди, которые просто пытаются помочь. - person Jonathan Wood; 22.02.2011
comment
@Jonathan: Дело в том, что вы полагаете, что мы используем потенциально непригодное и концептуально неверное решение вместо другого столь же простого, но абсолютно правильного решения. И спасибо, что назвал меня придурком. - person GManNickG; 22.02.2011
comment
@Matt: Какая реальность влечет за собой использование некачественного решения по сравнению с передовым решением, когда оба требуют одинакового количества усилий? Лучше всего выбрать самое известное решение. - person GManNickG; 22.02.2011
comment
@GMan: В данном случае комментарий о придурке больше подходил для описания Сумасшедшего Эдди. У меня нет проблем с людьми, пытающимися показать, чем конкретный подход лучше. Но есть довольно много людей, которые, кажется, в последнее время увеличиваются на SO, которые, кажется, более зациклены на подавлении других. - person Jonathan Wood; 22.02.2011
comment
@GMan Я не могу сказать точную разницу в требуемых усилиях, может быть, ни одной, когда я полностью пойму, как реализовать копирование и обмен. Но я знаю, что объяснение подкачки, с которым было связано, было на несколько порядков длиннее, чем объяснение Джона выше, и, бегло просматривая его, я мог видеть, что мне потребуется время, чтобы получить информацию. Но я ценю вашу информацию, и я добавил страницу в закладки. Я уверен, что дойду до чтения, если продвинусь так далеко. - person Matt Munson; 22.02.2011