10

私は、メイン クラス、rolodex クラス、およびカード クラスを必要とする仮想 rolodex の宿題プロジェクトに取り組んでいます。すべての「カード」の内容をコンソールに出力するために、代入では main() が rolodex クラスの show(...) 関数を呼び出し、ostream を渡して show(...) を繰り返します。各カードの showCard() 関数を呼び出します。実際の表示は、カード オブジェクトの showCard() 関数によって行われ、提供された ostream に表示されます。

私が理解していないのは、ostream がどこにでも渡される/渡されるべき理由です。割り当ては次のようなものを求めているようです:

main() {
   Rolodex myRolodex; 
   ostream myStream; 
   myRolodex.show(myStream); 
}

void Rolodex::show(ostream& theStream) {
   //for each card 'i' in the Rolodex...
   myCard[i].show(theStream);
}

void Card::show(ostream& theStream) {
   theStream << "output some stuff" << endl;
}

このようなものの代わりに:

main() {
   Rolodex myRolodex;  
   myRolodex.show(); //no ostream passed 
}

void Rolodex::show() {
   //for each card 'i' in the Rolodex...
   myCard[i].show();//no ostream passed
}

void Card::show() {
   cout << "output some stuff" << endl;
}

パラメータとしての ostream の使用を誤解しているか、そのように ostream をストリームに渡す他の明白な理由を見逃していますか?

4

2 に答える 2

14

私が理解していないのは、ostream がどこにでも渡される/渡されるべき理由です。

これは、テストなどによく使用されます。通常のコンソール出力が必要な場合は、への参照を渡しますstd::cout。しかし、単体テストや受け入れテストなどのテストを実行したい場合があり、そのために出力をメモリに保存したい場合があります。これに使用できますが、使用std::stringstreamしている機能は賢明ではありません。

これは特定のケースの 1 つですが、一般に、データ ソースまたはシンクの送信元/送信先を変更したい場合は、ストリームを渡すことでそれを行うことができます。

たとえば、次のようにすると、rolodex がコンソールに出力されます。

int main()
{
    Rolodex myRolodex;
    myRolodex.show(std::cout);
}

...しかし、明日代わりにファイルに書き込みたい場合は、Rolodex 内のコードにまったく影響を与えずにそれを行うことができます。

int main()
{
    Rolodex myRolodex;
    std::ofstream file("This\\Is\\The\\Path\\To\\The\\File.txt");
    myRolodex.show(file); // Outputs the result to the file,
                          // rather than to the console.
}
于 2011-04-01T00:24:48.133 に答える