2014-01-26 51 views
1

我有一組指針指向圖像塊對象。我有一個派生類成員函數返回一個指向這些圖像塊的指針,它是一個虛函數,所以我不能改變返回類型而不會破壞所有內容。將指針分配到指針數組中

這是我到目前爲止有:

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

'Ivalue',你的意思是'lvalue'。 – 2014-01-26 00:27:00

回答

2

如果你想分配的指針,你需要創建一個指針數組。你有什麼是ImageBlock對象的數組,這樣就提供瞭解決方案,即

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

是完全沒有問題。如果你想使指針數組,你需要聲明和不同的使用它:

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

當然現在是:

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

現在,您可以用方括號進行分配您有責任刪除objArray的元素。

更好的解決方案是使用智能指針向量。這將使你從顯式內存管理的任務中解放出來:

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

我使用了雙指針表示法。我正在做的這個項目很簡單,但我寧願更多地瞭解內存管理和它的邏輯。使用它肯定減少了我擁有的代碼量。謝謝,如果我有時間的話,我會查看載體。 – pgwri