c ++返回新对象的函数与将函数的结果赋给调用它的对象之间的区别

时间:2012-07-12 00:44:24

标签: c++

问题有点尴尬,但希望我的例子更有意义。

作为参考,我正在编写的程序有一个窗口供用户输入信息,当用户点击保存窗口创建一个Person对象时,用populatePerson()从窗口填入信息,并调用Person类中的函数将信息保存到文件中。

我努力寻找一种方法让窗口类调用Person函数,因为我会得到一个关于无法调用非静态函数的错误,但后来意识到我需要第二个“空” “Person对象调用savePerson()函数。我也做了一个类似的设置来从文件加载一个人。

例如:

void Person::savePerson(Person p)
{
    //open file
    //write p to file
    //return
}

Person Person::loadFile(String filename)
{
    //open file
    //make new person
    //put file contents into person
    //return person
}

为了打电话给我,我需要做这样的事情

Person NewPerson = populatePerson();

Person Save;
Save.savePerson(NewPerson);    

Person Load;
NewPerson = Load.loadPerson("file the person was saved to");

我认为这有点尴尬,因为除了在类中调用函数之外,我没有使用Save和Load Persons。我关心的对象是NewPerson。

然后我发现我可以使用* this来执行savePerson()和loadPerson()中的操作,而不是传入Person或返回Person。

例如:

void Person::savePerson()
{
    //open file
    //write *this to file

}

void Person::loadPerson(String filename)
{
    //open file
    //read file and put it in *this

}

然后像这样打电话给他们

Person NewPerson = populatePerson();

NewPerson.savePerson();
NewPerson.loadPerson("file the person was saved to");

第二个解决方案对我来说似乎更有意义,这两种方式似乎都可以编译并运行得很好。问题基本上是,这些解决方案中的一个比另一个好吗?要么做一件坏事吗?无论哪种方式都会导致意想不到的问题?

另外,最好先将保存和加载函数设置为静态,这样窗口可以调用它们而不需要Person实例来调用它们吗?

(抱歉,对于伪代码,实际代码主要是Qt,这可能会引起混淆,但这似乎更像是一个普通的C ++问题。)

1 个答案:

答案 0 :(得分:0)

相信你的直觉;第二个是两者中较好的一个。当你只对一个人感兴趣时,不得不创造3个人而不是一个人,这是一个死的赠品。 savePerson显然非常有意义,因为编写(“保存我”)和loadPerson运行一秒钟(“从文件填充我”),虽然如果你为Person创建了一个构造函数来加载文件,你可以避免要么在调用loadPerson之前将Person取消初始化,要么浪费时间初始化它只是为了使用loadPerson覆盖它。