为什么这个组合程序要求输入两次值?

时间:2017-01-02 18:45:14

标签: c++

Main.cpp的

#include <iostream>
#include "birthday.h"
#include "people.h"
using namespace std;

int main()
{
    birthday object;
    people object2;
}

birthday.h

#ifndef BIRTHDAY_H_
#define BIRTHDAY_H_

class birthday
{
public:
    birthday();
    void printdate();
private:
    int d,m,y;
};
#endif 

birthday.cpp

#include <iostream>
#include "birthday.h"
using namespace std;

birthday::birthday()
{
    cout << "Input date";
    cin >> d;
    cout << "Input month";
    cin >> m;
    cout << "Input year";
    cin >> y;
    cout << d << "/" << m << "/" << y << "\n";
}
void birthday::printdate()
{
    cout << d << "/" << m << "/" << y << "\n";
}

people.h

#ifndef PEOPLE_H_
#define PEOPLE_H_
#include <string>
#include "birthday.h"

class people
{
public:
    people();
private:
    birthday dateofbirth;
    std::string x;
};
#endif

people.cpp

#include <iostream>
#include "people.h"
#include "birthday.h"
using namespace std;

people::people()
{
    cout << "Enter the string";
    cin >> x;
    cout << x << "  was born on ";
    dateofbirth.printdate();
}

该程序运行良好,但它要求两次日期,月份和年份。我找不到问题的根源所在。当我运行它时,它要求输入日期,然后是月份和更晚的年份。循环再次重复,然后程序按原样运行。

3 个答案:

答案 0 :(得分:3)

因为您正在创建2个生日对象。

一个在你的主人,一个在人民中。

答案 1 :(得分:3)

birthday的默认构造函数会提示用户输入并接受输入。两个生日被实例化。

int main()
{
    birthday object; << here
    people object2; << and here
}

为什么在object2?因为people包含birthday类型的成员。

class people {
public:
    people();
private:
    birthday dateofbirth; <<because of here
    std::string x;
};

解决方案是不在构造函数中获取输入或提供不接受输入的构造函数。我建议像:

class birthday {
public:
    birthday(int day, int month, int year): 
            d(day),m(month),y(year),
    {
    }

    void printdate();
private:
    int d,m,y; // seriously consider using more descriptive names.
};

class people {
public:
    people(int day, int month, int year): 
        dateofbirth(day, month, year)
    {
    }
private:
    birthday dateofbirth;
    std::string x;
};

输入来自用户,经过验证,然后用于构建people实例,后者又构建birthday

构造函数中的:告诉编译器后跟Member Initializer List。这允许您在进入构造函数体之前构造非平凡成员,并将参数传递给继承类的构造函数。

答案 2 :(得分:2)

您正在birthday类的构造函数中执行输入/输出。您在程序中创建了两个birthday个对象。

  1. int main()函数
  2. 作为people对象的成员。
  3. 您应该考虑将IO工作转移到成员函数。这样你就可以在需要的时候做你的IO。

    int main()
    {
       birthday object;
       object.get_input();     //Do your IO
       people object2;
    }
    

    PS:尽可能避免在构造函数中执行IO,有一些例外情况,但对于您自己的用例,它只是糟糕的设计。就像你有一个负责打印日期的void birthday::printdate()成员函数一样,你应该同样在一个类似命名的函数中移动你的输入操作,比如说void birthday::get_input()