2013-10-19 53 views
1

我在C++中遇到了這個小問題:當我嘗試檢查字段的值時,爲什麼會得到一個奇怪的答案?

我在名爲angle.cpp的文件中創建了一個名爲Angle的對象。 它有一個double類型的字段叫degrees

這裏是我的構造吧:

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

我有我的角度類的適當的聲明在一個單獨的頭文件作爲標準配置。 到目前爲止,一切都看起來很簡單。

但是在我的main.cpp我有這個在我的功能之一:

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

此時angle對象的degrees應該有我鍵入到cin權的任何值?

我叫getDegrees()在angle.cpp剛剛返回無論degrees是另一種功能,因爲我做了degrees私人頭文件

但是當我用cout << angle.getDegrees()檢查,我得到這樣一個6.64651e-315數怪異,這絕對不是我給valuecin

+2

Angle.h看起來像什麼,Angle.cpp的其餘部分是什麼樣的? – nhgrif

+0

您發佈的代碼沒有任何內在的錯誤。如果您的「cin」輸入無法正確解析爲double(例如,文本字符串而不是數字),則會得到奇怪的結果。無論是你還是在你沒有顯示的代碼中犯了一些錯誤。 – vinaut

+0

在將它發送給構造函數以驗證其輸入是否正確之前,您是否嘗試過'value'的'std :: cout'值? –

回答

0

兩個建議:

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') 

最後一個評論: 你會經常看到cin.ignore

cin.ignore(10000, '\n') 

這也無視多達10000個字符,但上面顯示的第一種方式是跳到下一個換行符此短格式合適的C++標準兼容技術。

如果你發佈你的整個main.cpp和angle.cpp,我相信10人將在30秒內跳轉正確的答案。

0

你能檢查(或張貼在這裏)的getDegrees定義(這裏是示例代碼中的一個可以期待)

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

注: 不相關的問題,但你的構造可以也寫爲:

Angle::Angle(double deg) : degrees(deg) 
{ 
} 
0

我這樣做對我的Mac:

#include <iostream> 

class Angle 
{ 
    double degrees; 

    public: 
    Angle(double deg) { degrees = deg;} 
    Angle() {}; 
    double getDegrees() { return degrees;} 
}; 

int main (int argc, char** argv) 

{ 
    double d; 
    std::cout << "Give me some degrees: "; 
    std::cin >> d; 
    Angle a = Angle(d); 
    std::cout << a.getDegrees() << "\n"; 
    std::cout << Angle(d).getDegrees() << "\n"; 
    Angle b; 
    std::cout << b.getDegrees() << "\n"; 
} 

我得到了:

Give me some degrees: 24 
24 
24 
6.95323e-310 

所以我懷疑你是從一個未初始化的角度getDegrees'ing。您是否定義了這樣的拷貝構造函數,可能如下:

Angle(Angle& angle){}; 
相關問題