c++03 中是否存在常量指针数组?

Do constant pointer arrays even exist in c++03?

我是 c++ 的新手,我正在尝试创建一个 const 指针数组来保存一些结构的快捷方式。

我遇到的问题是 C++03(或我正在使用的编译器 - gcc 4.4.7)显然不支持常量指针数组?或者至少您不能为现有对象创建它们?

澄清一下,指针本身是常量,但它们指向的对象是可变的。数组结构是至关重要的,因为如果我以后可以通过索引访问这些对象,它会大大简化我的代码。

这是为了与具有飞行传统或其他东西的航天器硬件一起工作,所以使用更新的编译器是不可行的:/

struct Type1 {
    unsigned short thing1;
};
struct Type2 {
    Type1 thing2;
};
struct Type3 {
    Type2 thing3;
};

class A {
    Type3 Array[4];
    Type1 *const pArray[4] = {
        &Array[0].thing3.thing2,
        &Array[1].thing3.thing2,
        &Array[2].thing3.thing2,
        &Array[3].thing3.thing2
    };
};
error: a brace-enclosed initializer is not allowed here before ‘{’ token
error: ISO C++ forbids initialization of member ‘pArray’
error: making ‘pArray’ static
error: invalid in-class initialization of static data member of non-integral type ‘MyType* const [4]’

那么,考虑到我正在使用的编译器,是否有可能实现我正在尝试做的事情?

因为pArrayconst,它需要一个初始化器。因为它是一个 non-static 成员变量,所以它只能从构造函数的初始化列表中初始化。因为它是一个数组,所以在C++03中没有这样的语法。

一种可能的解决方法是将其设为 non-array:

#include <cstddef>

struct Type1 {
    unsigned short thing1;
};
struct Type2 {
    Type1 thing2;
};
struct Type3 {
    Type2 thing3;
};

class A {
    struct xarray4 {
        Type1 *data[4];
        xarray4(Type1 *p0, Type1 *p1, Type1 *p2, Type1 *p3) {
            data[0] = p0;
            data[1] = p1;
            data[2] = p2;
            data[3] = p3;
        }
        Type1 *&operator[](std::size_t n) {
            return data[n];
        }
        Type1 *const &operator[](std::size_t n) const {
            return data[n];
        }
    };

    Type3 Array[4];
    const xarray4 pArray;
    A() : pArray(
        &Array[0].thing3.thing2,
        &Array[1].thing3.thing2,
        &Array[2].thing3.thing2,
        &Array[3].thing3.thing2
    ) {
    }
};

这里pArray不是数组,而是重载了operator[]的对象。因为它是一个对象,我们可以给它一个自定义的构造函数,让我们按照我们想要的方式初始化它。

使用重载的 [] 运算符,我们仍然可以通过索引访问指针。