«Ошибка: несовместимые типы в присваивании» при попытке изменить размер массива указателей на объекты - PullRequest
1 голос
/ 24 октября 2019

Я пытаюсь изменить размер этого массива указателей на объекты. По сути, я пытаюсь создать новый массив указателей на объекты, в два раза больше исходного, заполнить новый исходным, а затем указать исходный на новый.

Похоже, что все работает, пока я не попытаюсь присвоить новый старый.

Если я просто сделаю копию для нового временного массива, он запустится. Если я пытаюсь назначить временный старый, он выдает ошибку.

Вот с чем я работаю:

Работа над этим, который является членом данныхфайла класса:

tiger *tigerDen[10];      //Tiger array

и его расширения следующим образом:

if (tigerIndexTracker + 1 > tigerDenSize)
{
    tigerDenSize = tigerDenSize * 2;
    tiger* temp[tigerDenSize];

    for (int count = 0; count < tigerIndexTracker; count++)
    {
        temp[count] = tigerDen[count];

    } 

    tigerDen = temp;

}

На самом деле не уверен, что нужно сделать, чтобы это сработало. Хотелось бы помочь.

Точная ошибка, которую я получаю (не уверен, что она понятна):

ошибка: несовместимые типы в присваивании 'tiger * [(((sizetype) (((ssizetype> ((zoo *) this) -> zoo :: tigerDenSize) + -1)) + 1)] 'to' tiger * [10] 'tigerDen = temp;

Естьстрелка, указывающая на оператор присваивания.

Редактировать: tigerDenSize - это просто int, для которого установлено значение 20. tigerIndexTracker - это int, для которого установлено значение 10. По сути, я пытаюсь определить, собирается ли объектбыть добавленным в массив, который будет превышать его предел, и если это так, создайте новый массив, в который я могу переместить все.

1 Ответ

2 голосов
/ 24 октября 2019

Хорошо, вот ваш код:

if (tigerIndexTracker + 1 > tigerDenSize)
{
    tigerDenSize = tigerDenSize * 2;
    tiger* temp[tigerDenSize];

    for (int count = 0; count < tigerIndexTracker; count++)
    {
        temp[count] = tigerDen[count];
    } 
    tigerDen = temp;
}

Происходит следующее: вы создаете новый временный массив в стеке, копируете в него содержимое, а затем, когда ваш оператор if заканчивается, эта памятьбудет использоваться повторно. Тьфу!

Правильный способ сделать это:

   tiger * temp = new tiger*[tigerDenSize];

   ... copy like you already do

   delete [] tigerDen;  // This frees the original array
   tigerDen = temp;

Кроме того, в вашем заголовке вам нужно изменить указатель:

   tiger ** tigerDen = nullptr;

Обратите внимание, что tigerDenSize тогда долженбыть назначен на 0 в начале. Или вы можете предварительно выделить несколько пробелов.

...