4

ここには、パラメーター化されたコンストラクターを使用しようとしている C++ で記述された単純なプログラムが含まれています。私の考えは、クラスを動的にインスタンス化し、必要なタスクをキャプチャすることです。しかし、プログラムを実行してタスク 1 を入力するたびに、単に 2 つの行が出力されます (つまり、名前を入力してください。電話番号を入力してください)。実際には「名前を入力してください」と表示されるはずです。次に名前を入力し、もう一度「Enter Tel.No.」を印刷します。どうすれば問題を解決できますか? オブジェクトの作成中に、パラメーター化されたコンストラクターを動的に使用する必要があります。

    #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();
     }
4

3 に答える 3

4

cin >> myTask最初の入力を読み取るために使用しています。Enterキーを押して1を指定すると、[レコードの追加]を選択すると、その1がバッファーから読み取られますが、改行は入力バッファーに残ります。したがって、最初のgetlineものはこれをバッファから読み取るだけで、行に空の入力を生成しますgetline(cin, fullname);

于 2012-12-03T08:43:11.297 に答える
3

その理由は、タスクタイプの後の最初の改行がによって消費されないためです。

cin >> myTask

したがって、fullname読み取り値は空の​​行のみを読み取り、「Tel.Noを入力してください」というものが直接印刷されます。

この問題を修正するgetlineには、の後に呼び出しを挿入します。cin >> myTask

この質問も参照してください。

于 2012-12-03T08:42:38.307 に答える
2

これはおそらくコンストラクタとは関係なく、むしろ cin >> と getline の混合に関係しています。cin >> myTask の後にガベージ変数に getline を追加すると、機能するはずです。

于 2012-12-03T08:39:39.843 に答える