C ++ 03中甚至存在常量指针数组吗?

时间:2019-07-05 21:53:20

标签: c++ arrays pointers const 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]’

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

1 个答案:

答案 0 :(得分:4)

由于pArrayconst,因此它需要一个初始化程序。由于它是一个非静态成员变量,因此只能从构造函数的初始化程序列表中进行初始化。因为它是一个数组,所以在C ++ 03中没有语法。

一种可能的解决方法是将其设置为非数组:

#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[]的对象。因为它是一个对象,所以我们可以为它提供一个自定义构造函数,该构造函数使我们可以按自己的方式对其进行初始化。

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