为什么编译器将类函数作为非静态函数处理?

时间:2019-06-18 10:28:52

标签: c++

我正在刷新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);

2 个答案:

答案 0 :(得分:7)

通过:: Scope Qualifier Operator完成静态访问:

std::cout << Useful::Date::end_of_month(d);

(C ++不是Java)

答案 1 :(得分:0)

您应该使用范围解析运算符::来访问静态数据成员以及C ++中类的静态函数。下面的行应该起作用。

std::cout << Useful::Date::end_of_month(d);