基本上我正在试验多态性。我有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();
};
答案 0 :(得分:8)
输入运算符
std::istream& operator>>(std::istream& is, std::string&)
只有 读取输入到下一个空格字符 。 (这就是Jerry Schwartz 25年前发明IO流时指定的方式。)如果你需要阅读整个行,那么
std::istream& getline(std::istream&, std::string&, char='\n')
是您需要使用的:
std::string name;
std::getline(std::cin, name);
输入可能失败 。例如,读取int
可能会失败,因为输入缓冲区中只有非数字数字。如果流操作失败,则会在流中设置状态位。发生故障后,流不会执行任何进一步的操作。然后,>>
的操作数将保持不变
因此,在使用数据之前,您需要 检查输入操作是否成功 。最简单的方法是在输入操作后检查流:
if(!std::cin) {
// input failed
}
答案 1 :(得分:1)
首先我认为(见下面的评论)sizeof
需要在对象周围加上括号。
第二个cin在输入时忽略空格。所以“何塞”变成了“何塞”。这可能是你遇到的问题。
答案 2 :(得分:1)
@sbi已经回答了你的主要问题。但是还有一些你可能需要注意的事情。
_getch()
或cin.get()
代替system("PAUSE")
。使用系统调用来保持命令窗口打开是不理想的。