1

私はC++でこの小さな問題を抱えています:

Angleangle.cpp というファイルで呼び出されるオブジェクトを作成しました。degreestypeというフィールドがありますdouble

これが私のコンストラクタです:

Angle::Angle(double deg)
{
   degrees = deg;
}

標準として別のヘッダー ファイルに、Angle クラスの適切な宣言があります。これまでのところ、すべてがシンプルで適切に見えます。

ただし、私の main.cpp では、関数の 1 つにこれがあります。

double value;
cin >> value;
Angle angle = Angle(value);

この時点で、angleオブジェクトdegreesには、入力した値が含まれているはずcinですよね?

ヘッダーファイルでプライベートにしたためgetDegrees()、angle.cppで呼び出される別の関数degreesがあり、何でも返すだけですdegrees

しかし、 で確認すると、 のcout << angle.getDegrees()ような奇妙な数字が表示されます。これは、私が渡した6.64651e-315ものではありません。valuecin

4

3 に答える 3

0

2 つの提案:

1)以下のように宣言するとき、「値」を初期化して、ランダムなコードが含まれないようにします。

2) cin バッファーをフラッシュします。

double value = 0;

// Clear the cin error flag
cin.clear();

// Ignore to the end of line
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')

cin >> value; 
Angle angle = Angle(value);

それが役立つことを願っています。

以下に示すように、cin を使用した後に、cin.clear (エラー フラグをクリアする) と cin.ignore (バッファをクリアする) の両方を呼び出す必要があることに注意してください。プログラムの早い段階で一部のデータを読み込んでいて、バッファをフラッシュしていない可能性があります。データを読み取った後にバッファをフラッシュしないと、次にデータを読み取ったときに表示される cin バッファにデータが残ることがあります。

たとえば、cin を使用してデータを読み込もうとしてエラーが発生した場合、エラー フラグが設定され、それ以降のすべての cin アクションが失敗します (cin.clear はフラグをリセットします)。さらに、エラーの原因となったデータがまだ cin バッファーに残っている可能性があります (cin.ignore によってフラッシュされます)。

cin >> value;  
cin.clear();  // Always call these two commands after using cin
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n')

最後に 1 つのコメント: cin.ignore のこの短い形式をよく見かけます。

cin.ignore(10000, '\n')

これも最大 10000 文字を無視して次の改行にスキップしますが、上記の最初の方法は適切な C++ 標準準拠の手法です。

main.cpp と angle.cpp 全体を投稿すると、30 秒以内に 10 人が正解に飛びつくことでしょう。

于 2013-10-19T00:53:07.833 に答える
0

の定義を確認(またはここに投稿)できますか(getDegrees ここに期待できるサンプルコードがあります)

double Angle::getDegrees()
{
    return degrees;
}

注:あなたの問題とは関係ありませんが、コンストラクターは次のように書くこともできます:

Angle::Angle(double deg) : degrees(deg) 
{
}
于 2013-10-19T00:55:41.773 に答える