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