我刚接触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]’
那么考虑到我正在使用的编译器,是否有可能做我想做的事情?
答案 0 :(得分:4)
由于pArray
是const
,因此它需要一个初始化程序。由于它是一个非静态成员变量,因此只能从构造函数的初始化程序列表中进行初始化。因为它是一个数组,所以在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[]
的对象。因为它是一个对象,所以我们可以为它提供一个自定义构造函数,该构造函数使我们可以按自己的方式对其进行初始化。
使用重载的[]
运算符,我们仍然可以按索引访问指针。