2012-11-19 49 views
1

我寫Stack.h這些如下代碼:如何在C++中初始化類中的非靜態常量變量?

class Stack{ 
public: 
    inline bool full(); 
    int size(); 
    inline bool empty(); 
    bool push(const string&); 
    bool pop(string &s); 
    bool peek(string &s); 
    virtual void print(); 
    virtual ~Stack(){} 

protected: 
    vector<string> _elem; 
    int const _maxsize=10; // line X 
}; 

我得到了錯誤:

Stack.h:14: error: ISO C++ forbids initialization of member ‘_maxsize’ 
Stack.h:14: error: making ‘_maxsize’ static 
make: *** [Stack.o] Error 1 

,如果我在行X添加靜態的關鍵字,並初始化類定義外部變量,它可以是好的。

但我的問題是,是否有任何可能的方式來聲明非靜態const變量,並仍然成功地初始化它?

回答

1

這在C++ 11中有效。在C++ 03中,你必須在構造函數中初始化它。 Alternitively,在C++ 11:

class Stack{ 
    int const _maxsize{10}; 
}; 
+0

OK ...我看是否寫了「Stack():_maxsize(10){}」,它會編譯....但爲什麼如果我編寫Stack(){const int _maxsize = 10;}? –

+0

因爲這會創建一個名爲'_maxsize'的新變量。 –

+0

是啊,看起來很合理......「const變量應該儘快初始化」。非常感謝。 –

2

是,初始化這個在構造函數

const int NumItems; 

Foo::Foo(): 
NumItems(15) 
{ 
//.... 
} 
1

您可以使用enum

class C { 
    protected: 
    enum { var = 10 }; 
} 

在這種情況C ::變種會被編譯時間常數,甚至可以在模板中使用。

另外,C++ 11允許您嘗試使用的聲明。

+0

嗯,我在Mac OS X中編碼。所以我猜默認的編譯器仍然是C++ 03? –

+0

@Yitong Zhou我不太瞭解Mac OS X.如果您使用的是gcc,可以嘗試將-std = C++ 11或-std = C++ 0x(對於舊版本)附加到gcc編譯參數。 – gluk47