将指针指向指针数组

时间:2014-01-26 00:23:45

标签: c++ pointers

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

这是我到目前为止所做的:

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 lvalueobjArray用红色下划线标出。我知道它会从数组中获取指针。我已经搜索了错误,我一直看到“你不能分配给数组”这样的东西,它不是传统意义上的数组吗?我有一些想法为什么它不起作用,但我想知道肯定。如果有人能提出一个更有趣的更好的解决方案。

由于

1 个答案:

答案 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)));