Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将指针分配到指针数组中_C++_Pointers - Fatal编程技术网

C++ 将指针分配到指针数组中

C++ 将指针分配到指针数组中,c++,pointers,C++,Pointers,我有一组指向图像块对象的指针。我有一个派生类成员函数,它返回一个指向这些图像块之一的指针,它是一个虚拟函数,因此我不能在不破坏所有内容的情况下更改返回类型 以下是我到目前为止的情况: ImageBlock* objArray = static_cast<ImageBlock*>( ::operator new ( sizeof ImageBlock * 256 ) ); for ( int i = 0; i < 256; i++ ) new (&objArra

我有一组指向图像块对象的指针。我有一个派生类成员函数,它返回一个指向这些图像块之一的指针,它是一个虚拟函数,因此我不能在不破坏所有内容的情况下更改返回类型

以下是我到目前为止的情况:

ImageBlock* objArray = static_cast<ImageBlock*>( ::operator new ( sizeof ImageBlock * 256 ) );

for ( int i = 0; i < 256; i++ )
    new (&objArray[i]) ImageBlock(blkh, blkw, 0.0);

for (int i = 0; i < 16; i++) {
    for (int j = 0; j < 16; j++) {
        ImageBlock* temp = getNewBlock(i, j, Image); // getBlock returns ImageBlock*
        objArray[i*16 + j] = *temp;
        delete temp;
    }
}
ImageBlock*objArray=static_cast(::运算符新建(sizeof ImageBlock*256));
对于(int i=0;i<256;i++)
新的(&objArray[i])图像块(blkh,blkw,0.0);
对于(int i=0;i<16;i++){
对于(int j=0;j<16;j++){
ImageBlock*temp=getNewBlock(i,j,Image);//getBlock返回ImageBlock*
objArray[i*16+j]=*温度;
删除临时文件;
}
}
正如你所看到的,这是一个糟糕的解决方案。我想使用一些指针算法直接分配指针,如下所示:

for (int i = 0; i < 16; i++) {
    for (int j = 0; j < 16; j++) {
        (objArray+(i*16 + j)) = getNewBlock(i, j, Image);
    }
}
for(int i=0;i<16;i++){
对于(int j=0;j<16;j++){
(objArray+(i*16+j))=getNewBlock(i,j,Image);
}
}
但是,我得到的错误
表达式必须是一个可修改的左值
,并且
objArray
带有红色下划线。我知道,如果从数组中获取指针,它会以另一种方式工作。我已经搜索了错误,我一直看到类似“你不能分配给数组”的东西,它不是传统意义上的数组,是吗?我有一些想法,为什么它不会工作,但我想知道肯定。如果有人能提供一个更好的解决方案,那将很有趣


谢谢

如果要分配指针,需要创建指针数组。您拥有的是一组
ImageBlock
对象,因此您提供的解决方案

objArray[i*16 + j] = *temp;
很好。如果要创建指针数组,则需要以不同的方式声明和使用它:

ImageBlock** objPtrArray = new ImageBlock*[256];
现在,您可以使用方括号表示法进行赋值:

objPtrArray[i*16 + j] = getNewBlock(i, j, Image);
当然,现在您有责任删除
objArray
的元素

更好的解决方案是使用智能指针向量。这将使您从显式内存管理的繁琐工作中解脱出来:

vector<unique_ptr<ImageBlock> > objVector(256);
...
objVector.push_back(unique_ptr<ImageBlock>(getNewBlock(i, j, Image)));
向量objVector(256);
...
向后推(唯一的ptr(getNewBlock(i,j,Image));

Ivalue
,你的意思是
lvalue
。我使用了双指针表示法。我正在做的项目很简单,但是我更愿意学习更多关于内存管理和它的逻辑。使用它确实减少了我的代码量。谢谢,如果我有时间的话,我会调查向量的。