我尝试使用其中一个枚举器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;
}
答案 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
中,min
和max
的值被换掉了。