C ++新手在这里!有一个类mother
,它分配了大量的记忆,因此我们希望避免复制。让father
和Individual
为两个reproduce
。我希望他们使用方法Individual
进行复制,以制作另一个名为baby
的{{1}}。
直观地说,我会使用默认构造函数初始化baby
,将参数传递给reproduce
并返回引用(尽管我认为没有必要返回引用)。这是一个执行该操作的代码
class Individual
{
public:
void reproduce (const Individual& father, Individual& baby)
{
// Set all attributes of baby
}
private:
// Plenty of variables
}
int main()
{
// Do Stuff
Individual mother(arg1,arg2,arg3);
Individual father(arg1,arg2,arg3);
// Do stuff
Individual baby;
mother.reproduce(father,baby);
}
这被视为良好做法吗?
另一种方法是直接在方法baby
中初始化reproduce
并返回引用,但我会预测baby
将在{{{}调用结束时被销毁1}}虽然。
reproduce
也可以使用外部功能,但我不知道可能代表什么优势。
答案 0 :(得分:6)
会员功能reproduce
应该返回宝宝。
预先生育一个仅仅因生殖行为而改变的婴儿是没有意义的 - 这更像是你的父母在家门口发现婴儿,被鹳放置,然后将婴儿塑造成他们的家庭;希望你现在知道这不是它的工作方式!
不要担心性能;如果你的Individual
类有一个移动构造函数(或遵循零规则),那么这是一个完整的非问题。即使不是,返回值优化也应该照顾好事情。
您尝试返回对局部变量的引用具有未定义的行为,因为您正确直观。所以不要这样做。
答案 1 :(得分:1)
我会给Individual
类一个带有两个Individual
输入参数的构造函数,例如:
class Individual
{
public:
Individual(Individual const& mother, Individual const& father)
{
// Pass on traits.
}
};
当然,除非reproduction
也会使父母松弛,羞耻或患有性传播疾病。
答案 2 :(得分:1)
你对以下内容是正确的:
另一种方法是直接在方法中初始化宝宝 重现并返回参考但我会预测宝宝 虽然会在复制的召唤结束时被摧毁。
所以第一种方式比上面提到的更好。
但是,我更喜欢(这只是我的恕我直言)使用动态分配。你可以使用你的第一种方法,如果你绝对确定,reproduce
方法是不可用的,并且它将来不可用(没有人确切知道的事情)。
想象一下你的代码会是什么样子的?
Individual baby;
mother.reproduce(father,baby);
if (baby.exists()) {
// do stuff
}
这里的问题是你正在创建 baby 甚至不确定它是否会被创建。我更愿意关注,你可以确定(如果你写的是正确的代码)只有在需要时才会完成所有的分配。
Individual* reproduce (Individual *father)
...
Individual *baby = mother->reproduce(father);
if (baby != nullptr) {
// do stuff
}
或
bool reproduce (Individual *father, Individual * &baby) // or **baby
...
Individual *baby = nullptr;
if (mother->reproduce(father, baby) {
// do stuff
}
第二种方式更容易出错或复杂(因为你应该照顾 baby 传递不存在,否则覆盖它可能导致内存泄漏)。注意:我更喜欢统一的代码(和对象的使用),所以改变了母亲和父亲的指针,这不是"必须做的"的事情。
此外,通过这种方式,您甚至可以安全地将婴儿指针存放在某些内部"儿童"在母亲中列出而不复制数据。
P.S。请记住在不再需要时删除 baby 。