2009-10-05 135 views
1

我们如何声明非静态常量数组作为类的属性?声明非静态常量数组作为类成员

下面的代码产生编译错误

'测试:: X':成员无法初始化

class Test 
{ 
public: 
    const int x[10]; 

public: 
    Test() 
    { 
    } 
}; 
+0

我需要存储一些编译时可用的配置数据。我希望将其放置在只读存储区域。 – Vadakkumpadath 2009-10-05 10:35:06

回答

3

你应该阅读this already posted question。由于无法做你想做的事,所以解决方法是使用std :: vector。

+0

Thaks回复。但是这种解决方案在数组的情况下是不可能的。当我们初始化数组时,我们将得到另一个编译错误(“不能指定数组的显式初始化器”)。 – Vadakkumpadath 2009-10-05 09:23:37

+0

我编辑了我的回复。我连接了错误的问题。请再看一遍。 – Ashwin 2009-10-05 09:33:56

+0

'std :: vector'不一样。它在堆上分配内存。 – 2009-10-05 10:07:32

1

您可以使用来自tr1的array类。

class Test 
{ 
public: 
const array<int, 10> x; 

public: 
Test(array<int,10> val) : x(val) // the only place to initialize x since it is const 
{ 
} 
}; 

array类可以简单地表示如下:

template<typename T, int S> 
class array 
{ 
    T ar[S]; 
public: 
    // constructors and operators 
}; 
0

使用boost::array(同TR1),它会看起来像:

#include<boost/array.hpp> 

    class Test 
    { 
     public: 

     Test():constArray(staticConst) {}; 
     Test(boost::array<int,4> const& copyThisArray):constArray(copyThisArray) {}; 

     static const boost::array<int,4> staticConst; 

     const boost::array<int,4> constArray; 
    }; 

    const boost::array<int,4> Test::staticConst = { { 1, 2, 3 ,5 } }; 

需要额外的代码静态成员因为{ { 1, 2, 3 ,5 } }在初始化列表中无效。

一些优点是,boost :: array定义了大小,开始和结束等迭代器和标准容器方法。

+0

数组具有迭代器和标准方法,如size/begin/end。不需要为一个简单的课程使用提升。 – 2009-10-05 10:33:26

+0

你说得对。但是在任何tr1实现之前,我都在使用boost。 – Arpegius 2009-10-05 11:04:01