我正在刷新C ++编程技能,并且正在阅读Stroustrup的书,以学习使用STL和现代C ++习惯用法进行编码。我决定从编写实用程序类Date
开始,该类应该支持基本的日期代数。我的Useful::Date
类具有一些静态函数,我想将其称为Date.is_bus_day()
,Date.plus_b_days()
,Date.plus_b_months()
等。
但是,由于某种原因,C ++似乎认为此函数是非静态函数而不是类函数。我不知道为什么会这样。我知道静态方法只能访问类的其他静态成员。
日期类
#include <iostream>
#include <string>
#include <vector>
template<typename T>
std::ostream& operator<<(std::ostream& os, const std::vector<T>& vec)
{
for (auto& el : vec)
{
os << el << ' ';
}
return os;
}
namespace Useful
{
typedef int Day;
typedef int Year;
enum Month{
January = 1,
February = 2,
March = 3,
April = 4,
May = 5,
June = 6,
July = 7,
August = 8,
September = 9,
October = 10,
November = 11,
December = 12,
JAN=1,
FEB=2,
MAR=3,
APR=4,
MAY=5,
JUN=6,
JUL=7,
AUG=8,
SEP=9,
OCT=10,
NOV=11,
DEC=12
};
enum Weekday{
Sunday = 0,
Monday = 1,
Tuesday = 2,
Wednesday = 3,
Thursday = 4,
Friday = 5,
Saturday = 6
};
class Date{
private:
Day d;
Month m;
Year y;
public:
Date()
{
d = 01;
m = JAN;
y = 1970;
}
Date(Day d, int m, Year y) {
this->d = d;
this->m = Month(m);
this->y = y;
}
friend std::ostream& operator << (std::ostream& os, Date& d);
Day day_of_month()
{
return d;
}
//Day get_day_of_year()
//{ ; }
Month month()
{
return m;
}
Year year()
{
return y;
}
static bool is_leap_year(Date d)
{
return ((d.year() % 4 == 0) && (d.year() % 100 != 0)) || (d.year() % 400 == 0);
}
static Day end_of_month(Date d)
{
int e = 0;
switch(d.month())
{
case JAN :
e = 31;
break;
case FEB :
if(is_leap_year(d))
e = 29;
else
e= 28;
break;
case MAR :
e = 31;
break;
case APR :
e = 30;
break;
case MAY :
e = 31;
break;
case JUN :
e = 30;
break;
case JUL :
e = 31;
break;
case AUG :
e = 31;
break;
case SEP :
e = 30;
break;
case OCT :
e = 31;
break;
case NOV :
e = 30;
break;
case DEC :
e = 31;
break;
}
return e;
}
static bool is_end_of_month(Date date)
{
return (date.d == end_of_month(date));
}
};
main()以测试Date类
int main()
{
Useful::Date d(01,06,2019);
std::cout << d << std::endl;
std::cout << Useful::Date.end_of_month(d);
return 0;
}
在这种情况下,编译器会抱怨-
jdoodle.cpp: In function 'int main()':
jdoodle.cpp:169:30: error: expected primary-expression before '.' token
std::cout << Useful::Date.end_of_month(d);
答案 0 :(得分:7)
答案 1 :(得分:0)
您应该使用范围解析运算符::
来访问静态数据成员以及C ++中类的静态函数。下面的行应该起作用。
std::cout << Useful::Date::end_of_month(d);