2014-01-26 7 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 lvalue с objArray подчеркнуты красным. Я знаю, что это сработало бы наоборот, взяв указатель из массива. Я искал ошибку, и я продолжаю видеть такие вещи, как «вы не можете назначить массивы», но это не массив в обычном смысле? У меня есть несколько соображений о том, почему это не сработает, но я хотел бы точно знать. Если бы кто-нибудь мог предложить лучшее решение, которое было бы интересно.

Благодаря

+1

'Ivalue', вы имеете в виду' lvalue'. –

ответ

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))); 
+0

Я использовал двойную нотацию указателя. Проект, который я делаю, прост, но я бы предпочел узнать больше об управлении памятью и логике всего этого. Использование его определенно уменьшило количество кода, который у меня был. Спасибо, я посмотрю в векторы, если у меня будет время. – pgwri

Смежные вопросы