C++ 在c+;中将动态声明的数组作为常量传递+;
我使用如下函数动态创建了一个数组:C++ 在c+;中将动态声明的数组作为常量传递+;,c++,C++,我使用如下函数动态创建了一个数组: //.. double ** allocate_2d(const int wd1, const int wd2){ double **array = new double*[wd1]; for(int idx=0; idx<wd1; idx++) { array[idx] = new double[wd2]; } return array; } 但是,我得到以下错误: 从'double
//..
double ** allocate_2d(const int wd1, const int wd2){
double **array = new double*[wd1];
for(int idx=0; idx<wd1; idx++)
{
array[idx] = new double[wd2];
}
return array;
}
但是,我得到以下错误:
从'double**'到'const double**'的转换无效。
可以这样做吗?您可以使用
const\u cast
向对象添加constness(需要显式cast)
double**p=allocate_2d(100200);
//填充p
func(const_cast(p))//由p指向的数组将在func内只读
您仍然需要考虑是否需要<代码> const <代码>。
为什么OP的签名func(const double ** array){
// computations using array
}
在限定转换规则中将double**
作为参数传递时生成错误
引用(重点):
资格转换
- 指向类型T的of类型指针可以转换为指向同一类型T的morecv限定值的prvalue指针(换句话说,可以添加常量和波动性)
- [……]
- 指向非限定类型的指针可以转换为指向常量的指针李>
- [……]
- 两个指针的级别n数相同李>
- 如果P1的某个级别(零级除外)的cv1k鉴定中存在常数,则P2的同一级别cv2k中存在常数李>
- [……]
- 如果在某个级别k,P2的cv合格率高于P1,则在k之前,P2的每个级别(零级除外)都必须有常量:cv21、cv22。。。cv2k
- [……]
- 零级由非多级资格转换规则解决
<>这句话,我强烈建议改变总体设计,避免可能动态分配的锯齿数组,如果可能的话,在C++中,每当你想到“动态数组”时,你的下一个想法几乎总是应该是<代码> STD::vector < /代码>。使用
std::vector
您将不会遇到现在的问题(我知道有重复的,尽管我似乎找不到)。谢谢。我试试看。我仍然想了解它是什么工作。而且,在C++中,如果你关心性能和效率(通常是为什么选择C++),每当你想到“多维数组”时,你的下一个想法应该是将其元素存储在一维数组中;查看为什么不允许这样做。不,解决方法是使func
定义正确。不,人们肯定不会这样做。如果您想表示函数不修改参数,可以将参数标记为const
,这样编译器就可以防止修改,并确保传递正确的类型。@mark Ingram,是的,这可能是正确的解决方案。然而,人们有时确实会使用const
让其他人知道对象在当前状态下没有更改function@MarkIngram,我的意思是说函数不修改对象,而不是参数(我在评论中更正了这一点)@dsp_user类的方法背后的常数与此问题无关。您应该尝试解释为什么OP最初尝试的const double**array
不起作用。
double **p = allocate_2d(100,200);
// populate p
func(const_cast<const double**>(p));//array pointed by p will be read only inside func
func(const double ** array){
// computations using array
}
char** p = 0;
const char** p1 = p; // error: level 2 more cv-qualified but level 1 is not const
const char* const * p2 = p; // OK: level 2 more cv-qualified and
// const added at level 1
char** p = 0;
char * const* p1 = p; // OK in C and C++
const char* const * p2 = p; // error in C, OK in C++
void func(double const * const * array) {
// ... ^^^^^
}