2013-06-08 4 views
2

Я только начал изучать 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 

Как я могу справиться с этой ошибкой?
Спасибо.

+0

определить их вне класса - 'Дата :: default_date;' в одном файле реализации. –

+0

"Stroustrap ... Clases ..." ... Snort. –

+0

Также http://www.parashift.com/c++-faq/link-errs-static-data-mems.html – aschepler

ответ

2

Вы должны определить переменную таким образом:

Date Date::default_date(1, 1, 1980); 

И вы должны положить его в .cpp файл, а не .h один, потому что это определение, и если он где включен в файл заголовка, вы можете получить его несколько раз.

+0

Вместо того, чтобы делать именно это, я сделал 'static Date default_date (1,1,92)'. Это тоже сработало. Благодарю. – iamseiko

1

Удалите static ключевое слово от реализации в файле .cpp и избежать инициализации его 0:

Date.cpp:

Date Date::default_date(1, 1, 1970); 
+0

Вся суть этого вопроса в том, что член является 'static'. – Alnitak

+0

@ Алнитак Я не понимаю, что вы имеете в виду; вы используете 'static' в * объявлении * статической членной переменной, но не в * определении *. – trojanfoe

+0

sorry - mispro – Alnitak

-1
// header 
struct wtf{}; 
struct omg{ static wtf lol; /* declaration of lol */ }; 
// cpp 
wtf omg::lol; // definition of lol 

int main(){ omg().lol; /* test if you can instantiate omg and access lol */ } 
+0

@stefan У меня все объяснено в комментариях. – nurettin

+0

[@stefan] (http://stackoverflow.com/users/985296/stefan) - комментарии после // и между ними/* * / – nurettin

0

первого, если вы должны конструктором по умолчанию, static Date default_date; будет в порядке.

второй, вы должны инициализировать объект default_date, Date Date::default_date(1, 1, 1980);

Смежные вопросы