以下是练习某些类继承的书中的练习。但问题出在客户端,而不是类设计。(BaseCore、baseDMA、缺少DMA 和 hasDMA 是 BTW 类)。
// usedma.cpp -- polymorphic example (compile with dma.cpp)
#include <iostream>
#include "dma.h" // includes <iostream>
const int ELEMENTS = 1;
const int LENGTH = 30;
int main()
{
using std::cin;
using std::cout;
BaseCore *pArr[ELEMENTS];
char tempDate[LENGTH];
char kind;
for (int i = 0; i < ELEMENTS; i++)
{
cout << "\nEntering data for element #" << i + 1 << "\n\n";
cout << "Enter the date it was created: ";
cin.getline(tempDate, LENGTH - 1);
cout << "Enter 1 for baseDMA, 2 for lacksDMA, or 3 for hasDMA: ";
while (cin >> kind && kind != '1' && kind != '2' && kind != '3')
cout <<"Wrong data. Please, try again: ";
while (cin.get() != '\n')
continue;
char tempLabel[LENGTH];
int tempRating;
cout << "Enter the label: ";
cin.getline(tempLabel, LENGTH - 1);
cout << "Enter the rating: ";
cin >> tempRating;
if (kind == '1') // baseDMA
pArr[i] = new baseDMA(tempDate, tempLabel, tempRating);
if (kind == '2') // lacksDMA
{
char tempColor[LENGTH];
cout << "Enter the color: ";
cin.getline(tempColor, LENGTH - 1);
pArr[i] = new lacksDMA(tempDate, tempLabel, tempColor, tempRating);
}
if (kind == '3') // hasDMA
{
char tempStyle[LENGTH];
cout << "Enter the style: ";
cin.getline(tempStyle, LENGTH - 1);
pArr[i] = new hasDMA(tempDate, tempLabel, tempStyle, tempRating);
}
while (cin.get() != '\n')
continue;
}
cout << "\n";
for (int i = 0; i < ELEMENTS; i++)
{
pArr[i]->View();
cout << "\n";
}
cout << "Done.\n";
std::cin.get();
return 0;
}
示例执行:
为元素 #1 输入数据
输入创建日期:2012.01.01
为 baseDMA 输入 1,为缺少 DMA 输入 2,或为 hasDMA 输入 3:2
输入标签:缺少DMA
输入评分:15
输入颜色:蓝色
创建日期:2012.01.01
标签:缺少DMA
评分:15
颜色:
完毕。
似乎 Color 成员被分配了空字符。这种行为发生在if (kind == '2')
andif (kind == '3')
语句中(在这种情况下是 style 成员)。
如果我cin.get();
在 cin.getline() 之前放一个,它可以正常工作,但我必须按一个额外的键才能让程序要求输入。
为什么会这样?如果输入队列中有一个 '\n' 挂起,cin.getline() 会丢弃它并将 '\0' 放入变量中,我可以理解。但是程序要求我输入颜色,让我正常输入。另外,如果我放了一个 cin.get(),那么程序不应该在执行中等待额外的击键,它应该摆脱那个额外的 '\n'。我在这里想念什么?