gpt4 book ai didi

c++ - 将指针分配给指针数组

转载 作者:行者123 更新时间:2023-11-30 04:09:15 25 4
gpt4 key购买 nike

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

这是我目前所拥有的:

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 with objArray 有红色下划线。我知道它会以另一种方式从数组中获取指针。我已经搜索了错误并且我一直看到诸如“你不能分配给数组”之类的东西,它不是传统意义上的数组,是吗?我对为什么它不起作用有一些想法,但我想确定。如果有人能提供更好的解决方案,那将很有趣。

谢谢

最佳答案

如果你想给指针赋值,你需要创建一个指针数组。您拥有的是一组 ImageBlock 对象,因此您提供的解决方案,即

objArray[i*16 + j] = *temp;

完全没问题。如果你想制作一个指针数组,你需要以不同的方式声明和使用它:

ImageBlock** objPtrArray = new ImageBlock*[256];

现在您可以使用方括号符号进行赋值:

objPtrArray[i*16 + j] = getNewBlock(i, j, Image);

当然,现在您有责任删除 objArray 的元素。

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

vector<unique_ptr<ImageBlock> > objVector(256);
...
objVector.push_back(unique_ptr<ImageBlock>(getNewBlock(i, j, Image)));

关于c++ - 将指针分配给指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21358071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com