1

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

作为参考,我正在编写的程序有一个供用户输入信息的窗口,当用户单击保存时,该窗口会创建一个 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 and 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++ 问题。)

4

1 回答 1

0

相信你的直觉;第二个是两者中的佼佼者。当您只对一个 Person 感兴趣时,必须创建 3 个 Person 而不是 1 个,这是一个死的赠品。savePerson 显然在编写时非常有意义(“保存我”),并且 loadPerson 运行紧随其后(“从文件中填充我”),尽管如果您为 Person 创建了一个构造函数来加载文件,您可以避免不得不要么在调用 loadPerson 之前未初始化 Person,要么浪费时间初始化它只是为了使用 loadPerson 覆盖它。

于 2012-07-12T01:22:45.930 回答