我有一组指向图像块对象的指针。我有一个派生类成员函数,它返回一个指向这些图像块之一的指针,它是一个虚函数,因此我无法在不破坏所有内容的情况下更改返回类型。
这是我到目前为止所做的:
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;
}
}
正如您所看到的,这是一个糟糕的解决方案。我想直接使用一些指针算法来指定指针,如下所示:
for (int i = 0; i < 16; i++) {
for (int j = 0; j < 16; j++) {
(objArray+(i*16 + j)) = getNewBlock(i, j, Image);
}
}
但是我收到错误expression must be a modifiable lvalue
,objArray
用红色下划线标出。我知道它会从数组中获取指针。我已经搜索了错误,我一直看到“你不能分配给数组”这样的东西,它不是传统意义上的数组吗?我有一些想法为什么它不起作用,但我想知道肯定。如果有人能提出一个更有趣的更好的解决方案。
由于
答案 0 :(得分:2)
如果要分配指针,则需要创建一个指针数组。你拥有的是一组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)));