大家好我想在C ++中创建一个日期类,它显示默认日期,显示一个设置日期,显示一个较长的设置日期,只显示一个设定的年份。但是,当我输入数据时,我正在尝试显示类的内容但是我收到错误"使用未声明的标识符' setDate'
这是头文件代码:
#ifndef dateClass_h
#define dateClass_h
using namespace std;
class DateObj
{
public:
int setDate(int month, int day, int year);
void shortDate(int month, int day, int year);
void longDate(string month, int day, int year);
//return the year
int getYear(int year){
return year;
}
private:
int month;
int day;
int year;
};
#endif /* dateClass_h */
这是我的实现文件代码:
#include <stdio.h>
#include <iostream>
#include <string>
#include "dateClass.h"
using namespace std;
//setDate Method
int DateObj::setDate(int month, int day, int year){
//setMonth = month;
//day = setDay;
//year = setYear;
//check to make sure month is between 1 - 12.
if(month < 1 || month > 12){
cout << "This is an invalid Month. Please enter a month that is between 1 and 12: " << endl;
}
//check to make sure day is between 1 -31.
if(day < 1 || day > 31){
cout << "This is an invalid Day. Please enter a day that is between 1 and 31: " << endl;
}
//check to make sure year is greater than zero.
if(year < 0){
cout << "This is an invalid Year. Please enter a year that is greater than Zero" << endl;
}
return setDate(month,day,year);
}
这是我的主要程序代码:
#include <iostream>
#include <string>
#include "dateClass.h"
using namespace std;
int main() {
DateObj myDate;
myDate.setDate(12, 25, 2016); //set the date to Dec 25, 2016.
cout << "The current date is: " << setDate() << endl;
return 0;
}
我只想知道为什么我会收到此错误以及我需要在课程或主程序中修复的内容。
修改 我得到了编译程序但是我在返回setDate(月,日,年)断点处得到以下错误&#34; EXC_BAD_ACCESS(code = 2,address = 0x7fff5f3fffe8)。
#include <iostream>
#include <string>
#include "dateClass.h"
using namespace std;
int main() {
DateObj myDate;
myDate.setDate(12,25,2016); //set the date to Dec 25, 2016.
cout << "The current date is: " << myDate.setDate(12, 25, 2016) << endl;
return 0;
}
答案 0 :(得分:1)
您的shortDate
功能似乎没有实现。
你的头文件中有它,但你似乎没有在你的dateClass.cpp文件中。您需要在dateClass.cpp文件中实现它,类似于您对setDate
的处理方式。
您收到错误是因为它无法找到任何实现。
答案 1 :(得分:1)
您收到错误的原因是setDate()
是void
函数。当您尝试在行中使用setDate()
时:
cout << "The current date is: " << setDate() << endl;
您收到错误,因为setDate()
需要返回std::ostream &
个对象或其他可转换的数据。我建议纯粹使用setDate(int month, int day, int year)
来设置类的数据成员,并创建一个单独的函数来实际打印出值。
作为替代方案,您可以重载setDate()
,以便它返回可接受的数据类型,如下所示:
#include <iomanip>
//the parameter 'right' is required for chaining together different << when forming output
std::ostream & DateObj::setDate(std::ostream & right) {
//displays the date in mm/dd/yyyy format
//setfill defines a character to fill empty spaces created by setw
right << std::setfill('0') << std::setw(2) << month
<< '/' << std::setfill('0') << std::setw(2) << day
<< '/' << std::setfill('0') << std::setw(4) << year;
return right;
}
答案 2 :(得分:0)
嗯,首先,你在setDate()中调用setDate(),这样它就可以无限地调用自身。你将调用setDate(),它将调用setDate(),它将调用setDate(),依此类推。我也是一个菜鸟,但我很确定你得到的是堆栈溢出错误(嘿,标题丢弃!:D)。当您分配太多变量并耗尽内存时,会发生堆栈溢出。因为你无限地调用setDate(),你也在其中制作无限版本的变量,并填满你所有的记忆。
另一方面,设定日期目前实际上并没有做任何事情。它会检查您是否有有效输入,然后再次调用自己。从名称来看,我认为它是为了填充你的成员变量?如果这是它应该做的,它应该看起来更像是这样:
int DateObj::setDate(int month, int day, int year){
//check to make sure month is between 1 - 12.
if(month < 1 || month > 12){
cout << "This is an invalid Month. Please enter a month that is between 1 and 12: " << endl;
}
//check to make sure day is between 1 -31.
if(day < 1 || day > 31){
cout << "This is an invalid Day. Please enter a day that is between 1 and 31: " << endl;
}
//check to make sure year is greater than zero.
if(year < 0){
cout << "This is an invalid Year. Please enter a year that is greater than Zero" << endl;
}
//the part that actually sets the variables. Aka, the important bit.
month_ = month;
day_ = day;
year_ = year
}
月,日和年的尾随下划线只是样式的东西,我喜欢将它们用于成员数据,这样我就可以在我的函数中再次使用这些名称作为局部变量,如果你注意到的话,这在这里很有用。将数据放入变量后,显示所有内容应该非常简单。做一些像:
cout << month_ << "/" << day_ << "/" << year_ << endl;
这会将您的日期输出到控制台,格式如下:3/12/2016。