创建第二个对象后,构造函数程序不会问我使用getline的是什么

时间:2016-07-30 12:31:41

标签: c++ constructor

所以我对C ++比较陌生,我正在做一个小项目,我让用户输入电影名称,评级和年份。对于第一次运行,该程序运行良好。用户输入所需信息后,我将其打印回屏幕,没有任何问题。但是,当我在同一次运行中创建第二个电影对象以执行相同的操作时,它会跳过它要求标题的部分并直接进入评级。有任何想法吗?这很可能是一个菜鸟错误。我的代码如下。

MovieProject.cpp

#include "stdafx.h"
#include "Movie.h"
#include <iostream>
#include <string>
using namespace std;

int main()
{
    Movie starwars;
    starwars.MovieTeller(starwars);
    Movie FerrisBueller;
    FerrisBueller.MovieTeller(FerrisBueller);
    Movie TheFoxandTheHound;
    TheFoxandTheHound.MovieTeller(TheFoxandTheHound);
    return 0;
}

Movie.cpp

    #include "stdafx.h"
    #include "Movie.h"
    #include <string>
    #include <iostream>

using namespace std;

Movie::Movie()
{
    cout << "What is the title of your movie:";
    getline(cin,Title);
    cout << "What is the Rating:";
    getline(cin,Rating);
    cout << "What year was it made:";
    cin >> Year;
    cout << "\n" << endl;
    if (Year > 2016) {
        cout << "Comon Dude stop messing around" << endl;
        exit(404);
    }
}

void Movie::MovieTeller(Movie a) {
    cout << "Title:" << Title << "\n" << "Rating:" << Rating << "\n" << "Year:" << Year << "\n" << endl;
}
Movie::~Movie()
{
}

Movie.h

#pragma once
#include <iostream>
using namespace std;
class Movie
{
public:
    Movie();
    ~Movie();
    void MovieTeller(Movie a);
private:
    string Title;
    string Rating;
    int Year;
};

2 个答案:

答案 0 :(得分:1)

在您使用getline运算符读取数字后使用>>时会发生这种情况。

以下是正在发生的事情:cal cin >> Year读取用户输入的所有数字,但保留尾随\n,因为它不是数字的一部分。在下一个对象的构造函数中调用getline时,\n仍然存在,因此getline将此输入计为空行。

您可以在阅读完年份后添加getline并忽略其结果来解决此问题。但是,更好的方法是从构造函数中完全删除输入,并将其移动到类的自定义输入运算符中。这样你的代码就会更清晰。

答案 1 :(得分:0)

代码还有另一个问题:方法MovieTeller不作用于作为此方法的参数传递的实例。它应该是

void Movie::MovieTeller(Movie a) {
    cout << "Title:" << a.Title << "\n" << "Rating:" << a.Rating << "\n" << "Year:" << a.Year << "\n" << endl;
}

OR此方法应声明为不带任何输入参数的公共方法。