1

質問はちょっと厄介ですが、うまくいけば、私の例がより理にかなっています。

参考までに、私が書いているプログラムには、ユーザーが情報を入力するためのウィンドウがあり、ユーザーが保存をクリックすると、ウィンドウが Person オブジェクトを作成し、populatePerson() でウィンドウからの情報を入力して、 Person クラスの関数を使用して、情報をファイルに保存します。

非静的関数を呼び出すことができないというエラーが発生するため、ウィンドウ クラスが Person 関数を呼び出す方法を見つけるのに少し苦労しましたが、2 番目の「空の」Person オブジェクトが必要であることに気付きました。 savePerson() 関数を呼び出します。ファイルから Person をロードするための同様の設定も行いました。

元:

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 を使用して、Person を渡すか、Person を返す代わりに、savePerson() および loadPerson() で操作を実行できることがわかりました。

元:

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");

2 番目の解決策は、私にはより理にかなっているように見えます。これらの方法は両方とも、コンパイルして問題なく実行できるようです。問題は基本的に、これらのソリューションの 1 つが他のソリューションよりも優れているかどうかです。どちらかが悪いことですか?どちらの方法でも、予期しない問題が発生する傾向がありますか?

また、代わりに save 関数と load 関数を最初に静的にして、ウィンドウがそれらを呼び出すために Person のインスタンスを必要とせずにそれらを呼び出すことができるようにする方がよいでしょうか?

(疑似コードで申し訳ありません。実際のコードはほとんどが Qt であり、混乱を招く可能性がありますが、これは一般的な C++ の質問のように思えました。)

4

1 に答える 1

0

あなたの直感を信じてください。2 番目の方が優れています。1 人の人物だけに関心がある場合、1 人ではなく 3 人の人物を作成する必要があるのは、完全な景品です。savePerson は書かれているとおり (「私を救ってください」) 明らかに完全に理にかなっており、loadPerson はすぐに実行されます (「ファイルから私を取り込みます」)。 loadPerson が呼び出されるまで Person を未初期化にするか、loadPerson を使用して上書きするためだけに初期化に時間を浪費します。

于 2012-07-12T01:22:45.930 に答える