2012-11-19 46 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