2013-11-03 36 views
-3

我想用我自己的頭從用戶那裏得到三個可變...使用CIN其他頭C++

這裏的一塊,我已經寫的代碼...

<class T> 
Sparse<T>::Sparse(){ 

    std::cout << "Please Enter The Following Information" << std::endl << "Row:" ; 
    std::cin >> this->rows; 
    std::cout << "Column:" << std::endl; 
    std::cin >> this->column; 
    std::cout << "Please Enter The Number of TermS:" << std::endl; 
    std::cin >> this->term; 

} 

我在我自己的頭在使用前向decelaration爲:

class cin; 

我遇到的問題是,你可以看到有沒有迴路之類的功能,但...

當我運行的代碼,編譯運行此塊multi_Times ... 像CIN就不能初始化變量...

像這樣

"Please Enter The Following Information" 
    "Rows:" 
    "Columns:" 
    "Please Enter The Number of TermS:" 
    "Please Enter The Following Information" 
    "Rows:" 
    "Columns:" 
    "Please Enter The Number of TermS:" 

請幫助... ..

額外的細節....

由於Mr.Coffin說我要使用「前進宣言」請幫我... 我如何必須使用... CAU SE包括其他的幀頭是這樣一個糟糕的風格來使用......

是的,我有兩個構造一個獲取參數的 其他作品這樣.... ,這是因爲我不想要有cin和cout以及很多equalation(=)在我的主... 感謝Mr.Coffin ....

+1

你能展示一個簡短的完整例子嗎? –

+1

我懷疑構造函數被另一次調用。你能告訴我們代碼嗎?而'cin'不是一個班級。這是標準輸入流的一個對象。 – Mahesh

+1

爲什麼不能'#include '? –

回答

3

類的構造函數用於初始創建對象。在這個例子中,這是默認的構造函數。一般來說,你可能不想在類的構造函數中編寫面向用戶的問題,更不用說默認的構造函數了。

寫你的方式意味着你創建一個未初始化稀疏的任何時候,用戶會被問到這些問題。

Sparse<int> a, b; 

這調用構造兩次,提問題的兩倍,迫使用戶回答問題不知道這「疏」,他們被質疑過。

Sparse<int> a, b; 

if (day == "Monday") { 
    a.something(); 
} else { 
    b = a; 
} 

在這裏,用戶會被提示問題,只有一週的某一天才有意義。

但是你也遇到這樣的問題:

std::vector<Sparse<int>> manySparses; 
manySparses.resize(1000); 

現在的用戶將要提出的問題...... 1000倍。

選擇以下兩種方法之一:在構造對象之前提出問題;或者選擇合理的默認值 - 例如值表示「我沒有數值」,然後填充施工後的數值,

您可以有一個靜態成員來提問該問題,或者您可以讓一個成員在構建該對象後詢問他們:

Sparse<int> a, b; 
a.GetConstraints(); 
if (day == "Monday") 
    b.GetConstraints(); 
else 
    b = a; 

但是不要寫一個默認的構造函數來詢問用戶這樣的問題。

----編輯,關於 'CIN' ----

'CIN' 不是一個類。這是一個對象。爲了便於攜帶,以及正確的良好實踐,您不應該注入自己的嘗試來聲明標準庫類型/結構體/函數,特別是不在標頭中。

相反,接受它作爲一個依賴,

#include <iostream> 
在你的頭文件

您嘗試使用它之前。

----編輯:最後的音符----

當你覺得在編程意義上的「建築」的嘗試想起「決定我要建一座摩天大樓」,而規模而不是「承擔建設帝國大廈,在101層銷售空間和僱用管理團隊」的工作。

這並不是說您不能/不應該編寫複雜的構造函數,但您的目標應該僅僅是讓對象進入程序的可靠狀態。

class string { 
public: 
    string() { 
     std::cout << "Enter the string you want: "; 
     std::cin >> m_string; 
     m_length = strlen(m_string); 
    } 
    ... 
}; 

VS

class string { 
public: 
    string() : m_string(NULL), m_length(0) {} 
    ... 
}; 

其次,具有會談到標準輸入一個構造/輸出從根本上削弱它的有用性。使用該邏輯從用戶獲取值沒有問題,但是如果將其放入類的構造函數中,那麼類只能在具有標準輸入/輸出的應用程序中使用(不需要應用gui和無頭應用程序)。

第三,你將如何處理錯誤?如果cin在第一個問題後關閉會怎麼樣?你的代碼不會檢查它,如果它確實如此,它將不得不將任務傳遞給創建對象的任何人。沒有人希望寫

try { 
    Object myObject; // may fail if user types 'wibble' instead of '13'. 
} catch (wibble_input_as_columns_exception& e) { 
    std::cerr << "Damnit, Dave, 'wibble' is not a valid number of columns." << std::endl; 
} 
+1

對於所有的事情來說,這是一個很好的答案,除了回答「class cin」這個鮮明的問題,這真的是個問題。 – ChiefTwoPencils

+0

這是一個相當公平的點,編輯。 – kfsone

+0

他似乎沒有真的在問這個問題,他的問題是「我遇到的問題是你可以看到,這個班的功能沒有循環但是...」。所以你是對的,他不需要「class cin」;聲明,這是錯誤的,但如果他做得好,他也不需要它。 – kfsone