Можно ли сделать так, чтобы тело конструктора копирования и оператора присваивания содержало один и тот же код без фактического дублирования кода (за исключением заголовков функций)?
Не дубликат. Другой вопрос - ответ на этот.
- personEdward Strange  schedule22.02.2011
comment
@Crazy: В этом суть дубликатов. Вопрос не в том, что другой вопрос решает ту же проблему. Как бы вы ответили на этот вопрос? Повторять информацию, содержащуюся в другом, а это было бы расточительно.
- personGManNickG  schedule22.02.2011
comment
Это не дубликат. Во всяком случае, ответ на вопрос, что такое идиома копирования и обмена? должен быть здесь.
- personFreelanceConsultant  schedule26.08.2015
Один из распространенных способов - это идиома копирования и обмена. Вам придется реализовать операцию подкачки, но если все сделано правильно, у вас есть дополнительное преимущество, заключающееся в безопасном назначении исключений.
Поместите функциональность в отдельный метод, а затем вызовите его как из конструктора копирования, так и из кода оператора присваивания.
В качестве альтернативы вы можете просто вызвать свой оператор присваивания из конструктора копирования.
personJonathan Woodschedule22.02.2011
comment
Оба метода останавливают инициализацию конструктора копирования (скорее, он назначает), и ни один из них не является безопасным в отношении исключений.
- personGManNickG; 22.02.2011
comment
@GMan: ?? Конструктор копирования должен сначала инициализировать себя до известного состояния. Я не уверен, что понимаю ваше возражение, если он затем вызывает оператор присваивания.
- personJonathan Wood; 22.02.2011
comment
@Jonathan: подумайте, не может ли один из членов быть сконструирован по умолчанию.
- personGManNickG; 22.02.2011
comment
Я вижу, что использование метода замены копии было бы предпочтительным выбором для тяжелого программирования. Но я думаю, что решение Джонатана приятно как простой легкий подход, а также отражает суть того, как проблема решается в целом.
- personMatt Munson; 22.02.2011
comment
@Matt: Копирование и обмен - это не совсем так. Если вы обнаружите, что это слишком много, возможно, C ++ вам не подходит.
- personGManNickG; 22.02.2011
comment
.... и он выбирает худший из возможных ответов.
- personEdward Strange; 22.02.2011
comment
Я проголосовал за все ответы, потому что думал, что все они хороши. Как начинающий программист, которого в основном интересуют другие области, я изучаю этот материал постепенно, так как мне нужна информация. Я знаю, что такой подход, вероятно, не одобряется, но это реальность моей ситуации, как человека, который может уделять только определенное количество времени овладению мастерством.
- personMatt Munson; 22.02.2011
comment
@GMan: процент случаев, когда невозможно установить все в известное состояние до вызова оператора присваивания, настолько мал, что ваше внимание к нему кажется подозрительным. @ Сумасшедший Эдди: Есть три ответа, два одинаковых. Как один из двоих мог быть худшим? @Matt: Не обращайте внимания на людей на SO, которые, кажется, должны что-то доказывать. Есть придурки, но есть и люди, которые просто пытаются помочь.
- personJonathan Wood; 22.02.2011
comment
@Jonathan: Дело в том, что вы полагаете, что мы используем потенциально непригодное и концептуально неверное решение вместо другого столь же простого, но абсолютно правильного решения. И спасибо, что назвал меня придурком.
- personGManNickG; 22.02.2011
comment
@Matt: Какая реальность влечет за собой использование некачественного решения по сравнению с передовым решением, когда оба требуют одинакового количества усилий? Лучше всего выбрать самое известное решение.
- personGManNickG; 22.02.2011
comment
@GMan: В данном случае комментарий о придурке больше подходил для описания Сумасшедшего Эдди. У меня нет проблем с людьми, пытающимися показать, чем конкретный подход лучше. Но есть довольно много людей, которые, кажется, в последнее время увеличиваются на SO, которые, кажется, более зациклены на подавлении других.
- personJonathan Wood; 22.02.2011
comment
@GMan Я не могу сказать точную разницу в требуемых усилиях, может быть, ни одной, когда я полностью пойму, как реализовать копирование и обмен. Но я знаю, что объяснение подкачки, с которым было связано, было на несколько порядков длиннее, чем объяснение Джона выше, и, бегло просматривая его, я мог видеть, что мне потребуется время, чтобы получить информацию. Но я ценю вашу информацию, и я добавил страницу в закладки. Я уверен, что дойду до чтения, если продвинусь так далеко.
- personMatt Munson; 22.02.2011