Я только начал изучать C++, используя оригинальную книгу Bjarne Stroustrap. Книга, в главе о Clases, есть пример создания класса Date, который имеет следующий интерфейс:Работа со статическими членами класса в C++
#pragma once
#include <string>
class Date
{
public: //public interface:
typedef
enum Month{Jan=1, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec}
Month;
class Bad_date{ }; //exception class
Date(int dd = 0, int mm = 1, int yy = 0);
Date(int dd = 0, Month mm =Month(0), int yy =0);
//functions for examining the Date:
int day() const;
Month month() const;
int year() const;
std::string string_rep() const; //string representation
void char_rep(char s[]) const; //C-style string representation
static void set_default(int, Month, int);
static Date default_date;
//functions for changing the Date:
Date& add_year(int n); //add n years
Date& add_month(int n); //add n months
Date& add_day(int n); //add n days
private:
int d, m, y; //representation
bool leapyear(int n); //check if year is a leapyear.
};
мне нужна помощь, чтобы понять, как статический член в этом классе, static Date default_date
работы. В моей реализации метода, я использую переменную, например, в моих первых нескольких строк конструктора
Date::Date(int dd, Month mm, int yy)
{
if(yy == 0)
yy = default_date.year();
if(iNt mm == 0)
mm = default_date.month();
if(dd == 0)
dd = default_date.day();
.
.
.
}
Когда я называю конструктор, я получаю undefined reference to 'Date::default_date'
ошибку при компиляции. Я читал в Интернете, что это, как правило, возникает, когда статическая переменная неинициализированными, поэтому я попытался, что, объявив переменную:
static Date default_date = 0; //or
static Date default_date = NULL;
либо из этих заявлений не работают, и они оба дают мне другую ошибку
invalid in-class initialization of static data member of non-integral type 'Date'
'Date Date::default_date' has incomplete type
Как я могу справиться с этой ошибкой?
Спасибо.
определить их вне класса - 'Дата :: default_date;' в одном файле реализации. –
"Stroustrap ... Clases ..." ... Snort. –
Также http://www.parashift.com/c++-faq/link-errs-static-data-mems.html – aschepler