1

以下是练习某些类继承的书中的练习。但问题出在客户端,而不是类设计。(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'。我在这里想念什么?

4

2 回答 2

5
cout << "Enter the rating: ";
        cin >> tempRating;

与 , 不同,istream::getline()operator>>尾随\n留在流中。getline它会导致对您的一个 if 语句内部的下一次调用获得空输入。

当控制流while (cin.get() != '\n')在 for 循环结束时到达语句时,流为空 - 它正在等待输入,并且看起来好像您仍在输入颜色。

马上打电话cin.ignore(),它会工作的。

请注意,如果您在颜色的输入语句之后放置“调试 cout”,则这种错误会立即显而易见。你得到的方式还有一个问题tempRating。如果输入无效的输入,比如“xy”,错误标志将被设置,cin程序将进入无限循环。始终检查输入操作是否成功。

于 2012-08-29T13:22:25.287 回答
1

如果我放一个 cin.get(); 就在 cin.getline() 之前它工作正常,但我必须按一个额外的键才能让程序要求输入。

在我看来,当你不放 cin.get() 时,你的 getline 会变成一个空字符。然后,当您放置 cin.get 时,您会得到那个空字符,并且您的 getline 工作正常。

但是你绝对应该去调试看看到底发生了什么!

于 2012-08-29T13:16:49.427 回答