1

これは、このWrite コードから c++ で書かれたプログラムで、指定された数値を単語に変換します (たとえば、入力として 1234 を入力すると、1234 が出力されます)数値を単語に変換するように修正しました。

私のプログラムでは、cout を使用して繰り返す代わりに、ostream オブジェクト out を作成し、戻り値を out に配置しました。

プログラムはこちら

#include<iostream>
using namespace std;
ostream & expand(int);
int main()
{
    int num;
    cin>>num;

   cout<<expand(num);
}
ostream & expand(int value)
{
ostream   &out;
out<<"";
    const char * const ones[21] = {"zero", "one", "two", "three","four","five","six","seven",
    "eight","nine","ten", "eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen",
    "eighteen","nineteen"};
    const char * const tens[10] = {"", "ten", "twenty", "thirty","forty","fifty","sixty","seventy",
    "eighty","ninety"};

    if(value<0)
    {
        out<<"minus "<<expand(-value);

    }
else if(value>=1000000){
out<<expand(value/1000000)<<" million";
if(value % 1000000)
{
out<<" "<<expand(value % 1000000);
}

}
    else if(value>=1000)
    {
        out<<expand(value/1000)<<" thousand";

        if(value % 1000)
        {
            if(value % 1000 < 100)
            {
                out << " and";
            }
            out << "  " <<expand(value % 1000);
        }
    }
    else if(value >= 100)
    {
        out<<expand(value / 100)<<" hundred";

        if(value % 100)
        {
            out << " and "<<expand (value % 100);
        }
    }
    else if(value >= 20)
    {
        out << tens[value / 10];
        if(value % 10)
        {
            out << " " << expand(value % 10);
        }
    }
    else
    {
        out << ones[value];
    }
    return &out;
}

ただし、コンパイル中に次のエラーが発生します。

In function 'std::ostream& expand(int)':
Line 13: error: 'out' declared as reference but not initialized
compilation terminated due to -Wfatal-errors.

私を助けてください。

ostream &out=cout;最後に と を設定してみましたreturn out。しかし、次の結果が得られcout<<expand(111234)ます。

one0x8050884 hundredeleven and 0x80508840x8050884 thousandtwo0x8050884 hundredthirtyfour 0x8050884 and 0x8050884 0x80508840x8050884

4

4 に答える 4

8

問題はここにあります:

ostream   &out;

コンパイラが教えているように、参照は初期化する必要があります。それらはデフォルトで構築できません。C++11 標準のパラグラフ 8.3.5/1 によると:

T& または T&& として宣言された変数、つまり「T 型への参照」 (8.3.2) は、 T型のオブジェクトまたは関数、または T に変換できるオブジェクトによって初期化されます

out標準出力にバインドする場合は、次のようにします。

ostream& out = std::cout;

または、関数のパラメーターを作成して、デフォルトoutでバインドすることもできます。std::cout

ostream& expand(int value, ostream& out = std::cout)
{
    out << "";
    // ...
}

このように、クライアントは呼び出しexpand()て、指定されたストリーム (たとえば anstd::ostringstreamまたは an std::ofstream) に出力するか、ストリームが指定されていない場合は標準出力に出力できます。

于 2013-04-03T09:21:48.940 に答える
2
ostream   &out; // Error

outオブジェクトによって初期化する必要があります。参照は常に何かを参照する必要があるためです。

ostream   &out = cout;
于 2013-04-03T09:21:23.240 に答える
0

そのような出力を連鎖させたい場合は、Andy's answer に記載されている方法を使用する必要があります。現在、システムは ostream ポインターを値として出力しようとしていますが、ストリームを入力パラメーターとして指定していないため、適切にチェーンできません。

于 2013-04-03T10:22:37.800 に答える