c+;中是否存在常量指针数组+;03? 我对C++是相当新的,我正在尝试创建一个const指针数组来保存一些结构的快捷方式。

c+;中是否存在常量指针数组+;03? 我对C++是相当新的,我正在尝试创建一个const指针数组来保存一些结构的快捷方式。,c++,arrays,pointers,constants,c++03,C++,Arrays,Pointers,Constants,C++03,我遇到的问题是C++03(或我使用的编译器-GCC4.4.7)显然不支持常量指针数组?或者至少不能为现有对象创建它们 为了澄清这一点,指针本身是恒定的,但它们指向的对象是可变的。数组结构非常重要,因为如果我以后可以通过索引访问这些对象,它将大大简化我的代码 这适用于具有飞行传统或其他特性的航天器硬件,因此不可能使用更新的编译器:/ struct Type1 { unsigned short thing1; }; struct Type2 { Type1 thing2; }; st

我遇到的问题是C++03(或我使用的编译器-GCC4.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
    };
};
错误:此处不允许在“{”标记之前使用括号括起的初始值设定项
错误:ISO C++禁止成员“PARRAY”的初始化
错误:使“pArray”为静态
错误:非整数类型“MyType*const[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
    ) {
    }
};
#包括
结构类型1{
未签名的短内容1;
};
结构类型2{
类型1事物2;
};
结构类型3{
第2类第3类;
};
甲级{
结构xarray4{
类型1*数据[4];
xarray4(类型1*p0、类型1*p1、类型1*p2、类型1*p3){
数据[0]=p0;
数据[1]=p1;
数据[2]=p2;
数据[3]=p3;
}
类型1*&运算符[](标准::大小\u t n){
返回数据[n];
}
类型1*常量和运算符[](标准::大小\u t n)常量{
返回数据[n];
}
};
类型3数组[4];
康斯特沙雷4帕雷;
A():帕雷(
&数组[0]。thing3.thing2,
&数组[1]。thing3.thing2,
&数组[2]。thing3.thing2,
&数组[3]。thing3.thing2
) {
}
};
这里的
pArray
不是一个数组,而是一个重载了
操作符[]
的对象。因为它是一个对象,所以我们可以给它一个自定义构造函数,让我们以我们想要的方式初始化它


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

因为
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
    ) {
    }
};
#包括
结构类型1{
未签名的短内容1;
};
结构类型2{
类型1事物2;
};
结构类型3{
第2类第3类;
};
甲级{
结构xarray4{
类型1*数据[4];
xarray4(类型1*p0、类型1*p1、类型1*p2、类型1*p3){
数据[0]=p0;
数据[1]=p1;
数据[2]=p2;
数据[3]=p3;
}
类型1*&运算符[](标准::大小\u t n){
返回数据[n];
}
类型1*常量和运算符[](标准::大小\u t n)常量{
返回数据[n];
}
};
类型3数组[4];
康斯特沙雷4帕雷;
A():帕雷(
&数组[0]。thing3.thing2,
&数组[1]。thing3.thing2,
&数组[2]。thing3.thing2,
&数组[3]。thing3.thing2
) {
}
};
这里的
pArray
不是一个数组,而是一个重载了
操作符[]
的对象。因为它是一个对象,所以我们可以给它一个自定义构造函数,让我们以我们想要的方式初始化它


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

请提供一个。这是类的一部分吗?
pArray
是否意味着
是静态的
?最后一条错误消息表明此问题和答问可能相关:@melpomene是的,它是类的一部分,我只打算在该类的方法中使用pArray。不确定我是否要确定hem静态与否。在这种情况下会有什么不同?我不知道。只有您这样做,并且您没有显示相关的上下文。一般来说:是的,您可以定义指针数组,这些指针可以是
const
,并且您可以在C++03中初始化这些数组。您可以在C中已经这样做了。如果您想要为您的ituation,发布a。@melpomene明白了,我已经编辑了这个问题。现在应该可以复制了。请提供a。这是类的一部分吗?
pArray
是否意味着
static
?最后一条错误消息表明这个问题与a可能相关:@melpomene是的,它是类的一部分,我只打算在该类的方法中使用pArray。N我不确定是否要将它们设置为静态。在这种情况下有什么区别?我不知道。只有您这样做,并且您没有显示相关的上下文。一般来说:是的,您可以定义指针数组,这些指针可以是
const
,您可以在C++03中初始化这些数组。您可以在C中已经这样做了。如果您希望“我不知道你的情况的确切代码,发布一个。@melpomene明白了,我已经编辑了这个问题。现在应该可以复制了。太棒了,谢谢@melpomene。我需要花一些时间来理解这个变通魔法,但它看起来很有希望。很抱歉问另一个问题/澄清,但是我可以通过引用自定义xArray来传递这些对象吗?”构造函数?假设参数语法更改为
Type1&p0,
等。编辑:nvm看起来像
Type1*数据[4];
是必需的,我们不能有引用数组。@ThomasKirven我很确定答案是肯定的。我还没有找到语法
Type1*&运算符[]的很好的解释(std::size\t n)
Type1*const和operator[](std::size\t n)const
。我对t有一些问题