2012-12-03 53 views
4

我在這裏包括一個用C++編寫的簡單程序,我嘗試使用參數化構造函數。我的想法是動態實例化類並捕獲所需的任務。 但是,每當我運行程序並輸入任務1時,它只是打印兩行(即輸入名稱。輸入電話號碼)。它實際上應該打印「輸入名稱」。然後輸入名稱,然後再次打印「輸入電話號碼」。 我該如何解決這個問題?我必須在創建對象時動態使用參數化構造函數。C++中的動態參數化構造函數問題

#include <iostream> 
    #include <conio.h> 
    #include <fstream> 
    #include <string> 

using namespace std; 

class myClass 
{ 
    string fullname,telephone; 

public: 
     myClass(int taskType = 2) 
     { 
      if(taskType==1) 
      { 
       add_record();     
      } 
      else if(taskType==2) 
      { 
       //view_records(); 
      } 
      else if(taskType==3) 
      { 
       //delete_record(); 
      }else{ 
      // custom_error(); 
      }   
     } 
void add_record() 
{ 
cout << "Enter Name.\n"; 
getline(cin, fullname); 
cout << "Enter Tel. No.\n"; 
getline(cin, telephone); 
} 
    }; 

    main(){ 
      int myTask; 
     cout << "Enter a Task-Type. \n" 
      << "1 = Add Record," 
      << "2 = View Records," 
      << "3 = Delete a Record\n\n"; 
     cin >> myTask; 
     myClass myObject(myTask); 
      getch(); 
    } 

回答

2

這可能與您的構造函數無關,而是與cin >>和getline的混合。在cin >> myTask後面添加一個getline到一個垃圾變量,它應該可以工作。

+0

是的它的工作......非常感謝你:) –

3

的原因是任務型後的第一個換行符不被

cin >> myTask 

消耗,因此fullname讀數將只讀取一個空行和「進入Tel.No」的東西會被直接打印。

cin >> myTask之後插入getline來解決這個問題。

另請參閱this question

+0

非常感謝你的快速響應,我添加了getline( cin,myTask);在cin之後>> myTask,但是我得到了錯誤:(....我應該更改myTask的數據類型嗎?通過爲垃圾變量應用getline修復了這個問題。 –

4

您正在使用cin >> myTask來讀取第一個輸入。按Enter鍵給出1,選擇「添加記錄」,將從緩衝區讀取1,但你的換行符仍然在輸入緩衝區中。因此,第一個getline將只讀取這個緩衝區,產生一個空行輸入getline(cin, fullname);