in C++, How can I give a class copy constructor and assignment operator the same functionality without making duplicate code
Possible Duplicates:
What is the copy-and-swap idiom?
Copy constructor and = operator overload in C++: is a common function possible?
有没有一种方法可以让复制构造函数和赋值运算符的主体包含相同的代码,而实际上没有重复的代码(函数头除外)?
- 当然:stackoverflow.com/questions/3279543/…
- 不是复制品。另一个问题是这个问题的答案。
- @疯狂:这就是重复的意义。它不是"问题是同一个"它是"另一个问题解决了同一个问题吗"。你将如何回答这个问题?通过重复另一个信息中包含的信息,这将是浪费。
- 这不是副本。如果有什么问题,请回答"什么是复制和交换习语?"应该在这里。
一种常见的方法是复制和交换习语。您必须实现一个交换操作,但是如果正确地完成了,您就有了异常安全分配的额外好处。
创建函数
1 2 3 4
| init(various parameters you need){
...
//common initializing process
} |
然后从所有构造函数、复制和赋值运算符调用此函数
将功能放在一个单独的方法中,然后从复制构造函数和赋值运算符代码中调用它。
或者,您可以从复制构造函数调用赋值运算符。
- 这两种方法都会阻止复制构造函数初始化(相反,它会赋值),并且都不是异常安全的。
- @盖曼:??复制构造函数必须首先将自身初始化为已知状态。我不确定我是否理解你的反对意见,如果它再打电话给作业员。
- @乔纳森:考虑是否其中一个成员不能默认构造。
- 我可以看到,对于重载编程,使用copy-swap方法将是更好的选择。但我认为,乔纳森的解决方案作为一种简单、轻量级的方法是很好的,它也抓住了问题解决的本质。
- @马特:复制和交换并不完全是"重负荷的"。如果你发现太多了,也许C++不是你的正确语言。
- ……他选择了最坏的答案。
- 嗯,我把所有答案都投了赞成票,因为我认为它们都很好。作为一个初学者程序员,他的主要兴趣是在其他领域,我采取一步一步地学习这些东西,因为我需要信息。我知道这样的方法可能是不受欢迎的,但这是我的实际情况,作为一个只能花这么多时间掌握手艺的人。
- @GMAN:在调用分配运算符之前,不可能将所有内容设置为已知状态的情况的百分比太小,以至于您对它的关注似乎是可疑的。@疯狂的埃迪:有三个答案,两个是一样的。两个人中的一个怎么可能是最坏的?@马特:别介意那些看起来需要证明的人。有一些混蛋,但也有一些人只是想帮忙。
- @乔纳森:重点是你假设我们使用了一个潜在的不可用和概念上不正确的解决方案,而不是另一个同样简单但绝对正确的解决方案。谢谢你叫我混蛋。
- @马特:什么现实要求你使用低于标准的解决方案而不是最佳实践解决方案,当两者都需要相同的努力时?你最好选择最著名的解决方案。
- @GMAN:在这种情况下,"混蛋"的评论更倾向于描述疯狂的埃迪。我不介意人们试图展示一种特定的方法是如何更好的。但是有相当多的人,最近似乎越来越多,所以他们似乎更专注于放下别人。
- @我不能说所需工作的确切区别,一旦我完全理解如何实现复制和交换,可能就没有了。但是我知道交换的解释比上面乔恩的解释要长出几个数量级,通过略读它,我可以看到我需要一段时间来获得信息。但我很感激你的信息,我把这页都登记了。我敢肯定,如果我进步那么快,我会读到的。