【问题标题】:Second Instance Of Object Not Working Correctly对象不正常工作的第二个实例
【发布时间】:2015-09-04 00:23:12
【问题描述】:

所以我正在研究我的课堂教科书中的一个示例从 C++ 开始:早期对象,我遇到了一个问题。我被指示创建一个程序,该程序读取一些数据并在最后打印它,总共 2 个实例。当第二个实例 (md2) 运行时,它不允许我在第一个字段中输入任何内容。这真的让我很烦恼,我无法弄清楚。提前致谢!

#include <iostream>

using namespace std;

class MovieData
{
private:
    string movieTitle;
    string movieDirector;
    int movieYear;
    int movieRunTime;
public:
    MovieData()
    {
        GetTitle();
        GetDirector();
        GetYear();
        GetRunTime();
    }

    void GetTitle()
    {
        cout << "Specify A Title\n";
        getline(cin, movieTitle);
        cout << endl;
    }
    void GetDirector()
    {
        cout << "Specify A Director" << endl;
        getline(cin, movieDirector);
        cout << endl;
    }
    void GetYear()
    {
        cout << "Specify A Year" << endl;
        cin >> movieYear;
        cout << endl;
    }
    void GetRunTime()
    {
        cout << "Specify A Duration In Minutes" << endl;
        cin >> movieRunTime;
        cout << endl;
    }

    void SetTitle()
    {
        cout << "R" << movieTitle << endl;
    }
    void SetDirector()
    {
        cout << "R" << movieDirector << endl;
    }
    void SetYear()
    {
        cout << "R" << movieYear << endl;
    }
    void SetRunTime()
    {
        cout << "R" << movieRunTime << endl;
    }


};

void PrintData(MovieData md);

int main() {
    MovieData md1;
    PrintData(md1);
    MovieData md2;
    PrintData(md2);
}


void PrintData(MovieData md)
{
    md.SetTitle();
    md.SetDirector();
    md.SetYear();
    md.SetRunTime();
    cout << endl;
}

【问题讨论】:

  • 旁注:你不需要实例化对象吗?
  • @BlackFrog 在Java或C#中,每个对象都是一个指针,所以需要用new命令初始化MovieData。 (即MovieData md1 = new MovieData()。这个例子是C++。在C++中,简单地声明一个类的实例将调用构造函数。
  • 是的,我认为这就是您的意思。我记得那些语言中的,但想知道你为什么提到它,哈哈。

标签: c++ instance


【解决方案1】:

发生这种情况的原因是您在准备md1 时从最终用户那里读取的最后一项是int。最终用户输入该整数,然后按 Enter。 C++ 将整数读入movieRunTime,但将 Enter 缓冲 的字符代码留给下一次读取。

下一次,输入的字符代码被返回到GetTitle,这意味着标题变成了一个空字符串。这就是您正在观察的行为。

要解决此问题,请在构造函数中添加对 std::cin.ignore 的调用:

MovieData()
{
    GetTitle();
    GetDirector();
    GetYear();
    GetRunTime();
    std::cin.ignore(256, '\n');
}

【讨论】:

  • @karite36 我认为了解正在发生的事情是你任务的重要组成部分。缓冲的影响会在输入和输出的多个地方出现,因此了解这里发生了什么非常有用。
  • 没有注意到复选标记。有效。我们从来没有讨论过缓冲,问题所在的那一章也没有。看看当学校每学期使用不同的书时会发生什么?不连贯。
猜你喜欢
  • 2020-02-06
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 2016-03-28
相关资源
最近更新 更多