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();
}
该程序运行良好,但它要求两次日期,月份和年份。我找不到问题的根源所在。当我运行它时,它要求输入日期,然后是月份和更晚的年份。循环再次重复,然后程序按原样运行。
答案 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
个对象。
int main()
函数people
对象的成员。您应该考虑将IO工作转移到成员函数。这样你就可以在需要的时候做你的IO。
int main()
{
birthday object;
object.get_input(); //Do your IO
people object2;
}
PS:尽可能避免在构造函数中执行IO,有一些例外情况,但对于您自己的用例,它只是糟糕的设计。就像你有一个负责打印日期的void birthday::printdate()
成员函数一样,你应该同样在一个类似命名的函数中移动你的输入操作,比如说void birthday::get_input()
。