标识符“Month”未定义

时间:2014-06-12 05:53:07

标签: c++

我尝试使用其中一个枚举器Month变量初始化Date对象,但编译器正在给出错误

  

标识符"月"未定义

有谁知道问题是什么?

#include<iostream>
#include<string>

using namespace std;

class Year {
    static const int max = 1800;
    static const int min = 2200;
public:
    class Invalid {} ;
    Year(int x) : y(x){ if ( x < min || x >= max ) throw Invalid(); }
    int year() { return y; }
private:
    int y;
};


class Date {
private:
    Year y;
    Month m;  // ERROR HERE
    int d;
public:
    Date( Month m, int d, Year y) // ERROR HERE AT Mont m
        :m(m), d(d), y(y) {}
    void add_day(int n);
    int month() {return m; }
    int day() { return d; }
    Year year() { return y; }
    enum Month { jan =1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec };
};    

Date today(Date::sep, 24, Year(1989));

void main() {
    cout << today.day() << endl << today.month() << endl << today.year() << endl;
}    

2 个答案:

答案 0 :(得分:1)

您必须先enum Month才能前往Month m;。它不像内联函数体那样工作,它可以访问尚未定义的类的其他变量。

一个选项只是将整个定义移到私有变量之前(或者将私有变量放在最后)。

在C ++ 11中,你也可以这样做:

class Date
{
    enum Month : int;    // forward-declaration; requires type spec
...
    enum Month : int { jan = 1, .....
};

请注意,cout中的main行也需要工作。 today.year()无法按原样发送到cout

一种选择是将其更改为today.year().year()。这是笨拙的;我建议您在class Year函数int year()内更改以获得更好的名称,例如year_as_int() const

您还可以定义流插入运算符(这是在文件范围内,而不是在类定义中):

std::ostream &operator<<(std::ostream &os, Year const &y)
{
    return os << y.year_as_int();
}

此外,所有不修改成员变量的成员函数都应具有const限定符。然后可以从你只有const引用的对象中调用它们,如我的例子所示。

答案 1 :(得分:0)

解决此问题的一种方法是将enum Month的定义转移到第一次使用之前的位置:

#include <iostream>

using namespace std;

class Year {
    static const int max = 2200;
    static const int min = 1800;
public:
    class Invalid {} ;
    Year(int x) :
            y(x)
    {
        if ( x < min || x >= max ) throw Invalid();
    }
    int year() { return y; }
private:
    int y;
};


class Date {
public:
    enum Month { jan =1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec };   
private:
    Year y;
    Month m;  // ERROR HERE
    int d;
public:
    Date( Month m, int d, Year y) // ERROR HERE AT Mont m
        :m(m), d(d), y(y) {}
    void add_day(int n);
    int month() {return m; }
    int day() { return d; }
    Year year() { return y; }
};    


int main() {
    Date today(Date::sep, 24, Year(1989));

    cout << today.day() << endl << today.month() << endl << today.year().year() << endl;
} 


/*
    Local Variables:
    compile-command: "g++ -g test.cc"
    End:
 */

请注意,对于您的构造,您需要在输出中使用today.year()。year()或为<<定义Year。此外,在Year中,minmax的值被换掉了。