3

基本的に私はポリモーフィズムを実験しています。私には、顧客と従業員の2つのオブジェクトがあります。顧客には名前と苦情があります。従業員には名前と給与があります。

ループでは、これらのパラメーターを取り込んで、配列に追加する新しいPersonを作成します。

しかし、ここに私の問題があります。文字列にスペースを入れると、ループは最後まで競合します。

Person *persons[10];

for (int i = 0; i < sizeof persons;i++)
{
    cout<<"Please type 1 for customer or 2 for Employee"<<endl;
    int q;
    cin>>q;
    string name;
    int salary;
    string complaint;


    if (q == 1)
    {
        cout<<"What is your name?"<<endl;
        cin>>name;
        cout<<"What is your complaint"<<endl;
        cin>>complaint;

        personPtr = new Customer(name,complaint);
        cout<<"Created customer"<<endl<<endl;
        persons[i] = personPtr;
        cout<< "added to array"<<endl<<endl;
    }
    else if(q==2)
    {
        cout<<"What is your name?"<<endl;
        cin>>name;
        cout<<"What is your salary"<<endl;
        cin>>salary;
        personPtr = new Employee(name,salary);
        persons[i] = personPtr;
    }
    else
    {
        cout<<"Sorry but i could not understand your input. Please try again"<<endl;
        i--;
        cin>>q;
    }
}
delete personPtr;
system("PAUSE");

文字列を含める特別な方法はありますか?

参考までに、顧客と従業員のクラスを次に示します。

class Person
{
public:
Person(const string n)
{name = n;}; // initialise the name
virtual void printName();
protected:
string name;
};


class Customer:public Person
{
public:
string complaint;

Customer(string name, string cm)
    :Person(name)
{       
    complaint=cm;
}
virtual void printName();
};

class Employee:public Person
{
public:
int salary;

Employee(string name,int sl)
    :Person(name)
{       
    salary = sl;
}
virtual void printName();
};
4

3 に答える 3

8
  1. 入力演算子

    std::istream& operator>>(std::istream& is, std::string&)
    

    次の空白文字までの入力のみを読み取ります(これは、25年前にJerry SchwartzがIOストリームを発明したときに指定された方法です。)行全体を読み取る必要がある場合は、

    std::istream& getline(std::istream&, std::string&, char='\n')
    

    使用する必要があるものです:

    std::string name;
    std::getline(std::cin, name);
    
  2. 入力に失敗する可能性があります。たとえばint、入力バッファには数字以外の数字しかないため、読み取りが失敗する可能性があります。ストリーム操作が失敗した場合、ストリームに設定される状態ビットがあります。障害が発生すると、ストリームはそれ以上の操作を実行しなくなります。その後、のオペランドは変更>>されません。したがって、データを使用する前に、入力操作が成功したかどうか
    を確認する必要があります。これを行う最も簡単な方法は、入力操作の後にストリームをチェックすることです。

    if(!std::cin) {
      // input failed
    }
    
于 2011-02-14T12:43:17.533 に答える
1

sizeofまず、オブジェクトを括弧で囲む必要があると思います。(以下のコメントを参照)

2番目のcinは、入力時に空白を無視します。つまり、「Jose」は「Jose」になります。それはあなたが抱えている問題かもしれません。

于 2011-02-14T12:43:38.330 に答える
1

@sbiはすでにあなたの主な質問に答えました。しかし、他にも注意が必要なことがいくつかあります。

  1. ポインタが削除された後、ポインタを保持しているため、後で問題が発生する可能性があります。
  2. の代わりに_getch()またはを使用する必要があります。システムコールを使用してコマンドウィンドウを開いたままにするのは理想的ではありません。cin.get()system("PAUSE")
于 2011-02-14T12:48:58.783 に答える