为方法提供一个空实例是一种好习惯吗?

时间:2016-10-12 00:10:32

标签: c++ performance class methods

C ++新手在这里!有一个类mother,它分配了大量的记忆,因此我们希望避免复制。让fatherIndividual为两个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

也可以使用外部功能,但我不知道可能代表什么优势。

3 个答案:

答案 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