如何解决如何更改默认构造函数的参数? 使用您的代码的示例 main()是完整示例
我有一个称为Date
的类,用于控制日期。
我有一个构造函数Date()
。如果此构造函数未初始化,则默认日期将由名为default_
的私有静态数据成员放置在其位置。
我已经在default_
中初始化了Date.cpp
,如下所示:
Date Date::default_{1,Month::January,1900};
第一个参数是白天的int
,第二个参数是月份的enum class
的{{1}},而第三个年份是Month
。 / p>
运行该程序时,我可以打印日期,并显示由int
设置的正确的默认日期。
问题:
我希望能够使用以下功能更改默认日期:
default_
我该怎么做?我尝试如下实施setDefaultDate(int day,Month month,int year)
,但无法正常工作:
setDefaultDate()
代码:
Date.h:
void Date::setDefaultDate(int day,int year)
{
default_ = {day,month,year};
}
Date.cpp:
#ifndef DATE_H
#define DATE_H
// date.h
// class Date declaration
#include <cassert>
#include <iostream>
using namespace std;
enum class Month
{
January = 1,February,March,April,May,June,July,August,September,October,November,December
};
class Date
{
public:
// return the day of the month
int day () const;
// return the month of the year
Month month () const;
// return the year
int year () const;
Date();
static void setDefaultDate(int day,int year);
private:
int day_;
Month month_;
int year_;
static Date default_;
};
// standalone function for printing the date
void printDate(const Date& date);
#endif
示例
// date.cpp
// Implementation of the Date class
#include "date.h"
int Date::day() const
{
return day_;
}
Month Date::month() const
{
return month_;
}
int Date::year() const
{
return year_;
}
// Note,this standalone function is not part of the Date class
void printDate(const Date& date)
{
cout << date.day() << "/"
// cast to an integer to allow the month to be sent to the stream
<< static_cast<int>(date.month()) << "/"
<< date.year()
<< endl;
}
Date Date::default_{1,1900};
void Date::setDefaultDate(int day,int year)
{
default_ = {day,year};
}
Date::Date()
{
day_ = default_.day();
month_ = default_.month();
year_ = default_.year();
}
预期输出:
29/9/2020
实际输出:
1900年1月1日
它可以编译,但是int main()
{
auto date_1 = Date{};
date_1.setDefaultDate(29,Month::September,2020);
printDate(date_1);
}
函数不起作用,并且正在输出在setDefaultDate()
中声明的默认日期。
解决方法
让我们一步一步地浏览您的main
:
auto date_1 = Date{};
这将做什么?它将调用Date::Date
,它将把所有值从default_
读入date_1
。此时default_
是1/1/1900
,现在date_1
是相同的。然后
date_1.setDefaultDate(29,Month::September,2020);
将仅更改default_
和default_
。我不确定您为什么期望date_1
在这里更改,也许是因为您像非静态成员函数那样调用了它?您可能打算更改默认日期之前从中读取。您可以这样做:
int main()
{
// call it like static function
Date::setDefaultDate(29,2020);
// Only then read from it.
auto date_1 = Date{};
// prints 29/9/2020
printDate(date_1);
}
,
您的setDefaultDate()
方法仅将default_
的值设置为{em> ,main()
已经在调用Date()
构造函数时复制了该值date_1
对象。之后更改default_
的值对date_1
的值没有任何影响。当打印date_1
时,将输出初始化时使用的值。更改default_
的值只会影响随后创建的后续 Date
对象。
如果要更改date_1
的值,则需要:
- 致电
setDefaultDate()
之前致电Date()
:
int main()
{
Date::setDefaultDate(29,2020);
Date date_1;
printDate(date_1); // 29/9/2020
}
- 添加非静态方法来更改
Date
对象的值。您还应该添加一个非默认构造函数,该构造函数可以采用用户指定的日期作为输入,例如:
class Date
{
public:
Date();
Date(int initialDay,Month initialMonth,int initialYear);
...
void setDay (int newValue);
void setMonth (Month newValue);
void setYear (int newValue);
...
};
Date::Date() :
Date(default_.day_,default_.month_,default_.year_)
{
}
Date::Date(int initialDay,int initialYear) :
day_(initialDay),month_(initialMonth),year_(initialYear)
{
}
void Date::setDay (int newValue)
{
day_ = newValue;
}
void Date::setMonth (Month newValue)
{
month_ = newValue;
}
void Date::setYear (int newValue)
{
year_ = newValue;
}
...
int main()
{
Date date_1;
printDate(date_1); // 1/1/1900
date_1.setDay(29);
date_1.setMonth(Month::September);
date_1.setYear(2020);
printDate(date_1); // 29/9/2020
date_1 = Date(9,2020);
printDate(date_1); // 9/9/2020
Date date_2(31,Month::December,2020);
printDate(date_2); // 31/12/2020
Date::setDefaultDate(1,Month::April,2020);
Date date_3;
printDate(date_3); // 1/4/2020
}
,
如果我正确理解的话,我将向您显示代码的修改版本,该版本应该可以满足您的要求。为了使用单个文件,我对您的代码做了一些更改
java不是C ++,C ++不是Java。 C ++中的static
东西不是Java方式。也许您已经习惯了。
C ++中的一件事是,您可以在main()
的外部中设置默认的运行代码,并在类外部设置为
...
}; // class Date{}
int Date::default_day = 1;
int Date::default_month = 1;
int Date::default_year = 1900;
void printDate(const Date& date);
void setDefaultDate(int,int,int);
int main(void)
{
...
因此,您已加载了第一组默认值。
如果您在
main()
中进行编译,则它将编译,但链接器会 抱怨他们三个都没有解决。
- 对于
setDefaultDate()
,您只需将其声明为Date的friend
friend void setDefaultDate(int,int);
-
PrintDate()
的一种方便且常见的替代方法是将另一个friend
声明为Date
,
friend ostream& operator<<(ostream&,Date&);
使用您的代码的示例
节目显示
just a date at start (should use defaults 1900,1,1)
printDate()
d: 1 m: 1 y: 1900
Now sets default to 1901/3/2
printDate()
d: 2 m: 3 y: 1901
Now declared new Date instance as d3(2019,8,7)
printDate()
d: 7 m: 8 y: 2019
Now print all 3 dates using "<<" operator,redefined for Date class
printDate using insertion operator '<<'
year is 1900 month is 1 year is 1900
printDate using insertion operator '<<'
year is 1901 month is 3 year is 1901
printDate using insertion operator '<<'
year is 2019 month is 8 year is 2019
main()
是
int main(void)
{
cout << "\njust a date at start (should use defaults 1900,1)\n";
Date d1;
printDate(d1);
cout << "\nNow sets default to 1901/3/2\n";
setDefaultDate(2,3,1901);
Date d2;
printDate(d2);
cout << "\nNow declared new Date instance as d3(2019,7)\n";
Date d3(2019,7);
printDate(d3);
cout << "\nNow print all 3 dates using \"<<\" operator,redefined for Date class\n";
cout << d1 << d2;
cout << d3;
return 0;
}
- 代码使用
printDate()
以及重载的<<
来替代printDate()
。我为三个cout
留了两个Date
,只是为了表明您可以像其他任何cout
调用一样链接打印。 - 程序在之前和内部
main()
设置默认值
- 我添加了第二个构造函数,该构造函数接受
day
,month
和year
作为参数
完整示例
#include <iostream>
using namespace std;
class Date
{
private:
int year_;
int month_;
int day_;
public:
int year() const { return year_; };
int month() const { return month_; };
int day() const { return day_; };
// default as Date d;
Date() :
year_(default_year),month_(default_month),day_(default_day) {};
// as Date d(2020,9,8)
Date(int y,int m,int d) :
year_(y),month_(m),day_(d){};
friend void setDefaultDate(int,int);
friend ostream& operator<<(ostream&,Date&);
private:
static int default_year;
static int default_month;
static int default_day;
}; // class Date{}
int Date::default_day = 1;
int Date::default_month = 1;
int Date::default_year = 1900;
void printDate(const Date& date);
void setDefaultDate(int,int);
int main(void)
{
cout << "\njust a date at start (should use defaults 1900,redefined for Date class\n";
cout << d1 << d2;
cout << d3;
return 0;
}
void printDate(const Date& date)
{
cout << "\nprintDate()\n" <<
" d: " << date.day() <<
" m: " << date.month() <<
" y: " << date.year()
<< endl;
};
void setDefaultDate(int day,int month,int year)
{
Date::default_day = day;
Date::default_month = month;
Date::default_year = year;
};
ostream& operator<<(ostream& out,Date& date)
{
cout << "\nprintDate using insertion operator '<<'\n" <<
"\tyear is " << date.year_ <<
" month is " << date.month_ <<
" year is " << date.year_ <<
endl;
return out;
};
这里没有宗教信仰。我在 MSVC 19.27
下编译了它版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。