在类中初始化固定大小的常量数组

时间:2011-11-17 17:57:09

标签: c++ c++03

考虑以下课程:

class A {
    const int arr[2];
public:
      A() { }
};

是否可以从构造函数初始值设定项列表中初始化arr,或者以声明它的行(即const int arr[2] = {1,2};)之外的任何其他方式初始化?

请注意,我对使用C ++ 98的方法感兴趣!

3 个答案:

答案 0 :(得分:4)

将它们包裹在struct中,例如:

class A
{
    struct Data
    {
        int arr[2];
    };

    Data const arr;
public:
    A() : arr( someOtherStruct ) {}
};

这意味着要访问数据,您必须编写arr.arr。 通过继承struct

可以避免这种情况
struct PrivateDataForA
{
    int arr[2];
};

class A : private PrivateDataForA
{
public:
    A() : PrivateDataForA( someOtherStruct ) {}
};

这确实使struct的名称在课堂外可见 (这可能是一个优势 - 客户端代码可以通过你作为一个 参数)。

如果你没有方便的结构实例,那就说你想要了 用它来填充从构造函数的参数计算出来的值 可以使用静态成员函数:

class A : private PrivateDataForA
{
    static PrivateDataForA createInitializer( int a, int b );
public:
    A( int a, int b ) : PrivateDataForA( createInitializer( a, b ) )
    {
    }
};

对于OP的具体例子:

#include <iostream>
#include <stddef.h>

typedef ptrdiff_t   Size;
typedef Size        Index;

template< class Element, Size n >
struct Array{ Element elem[n]; };

class A {
    Array<int, 2> const arr_;       // const int arr[2];

    A& operator=( A const& );       // No such.

    static Array<int, 2> const& oneAndTwo()
    {
        static Array<int, 2> const a = {1, 2};
        return a;
    }

public:
    A(): arr_( oneAndTwo() ) {}
    int at( Index i ) const { return arr_.elem[i]; }
};


int main()
{
    using namespace std;

    A o;
    for( int i = 0;  i < 2;  ++i )
    {
        cout << o.at( i ) << endl;
    }
}

答案 1 :(得分:2)

将数组元素初始化为非零值需要C ++ 11支持。

在C ++ 03中,只能对数组进行值初始化,导致每个元素的值为0

class A {
    const int arr[2];
public:
    A() : arr() { }
};

对于相关的C ++ 03标准,请参阅此问题和答案:
How can i use member initialization list to initialize it?

(我假设通过C ++ 98你的意思是 C ++ 11,即C ++ 03是可以接受的。如果这个假设是错误的,请这么说。)

答案 2 :(得分:-1)

没有。不是。