C ++ Object Array Pointer - PullRequest
       2

C ++ Object Array Pointer

0 голосов
/ 27 марта 2020

Я новичок в C ++ массивах и указателях и столкнулся с несколькими проблемами. У меня есть несколько запросов на следующий код, который я написал.

Версия 1:

int main() 
{  
  string a, b;
  int age;
  Dog d[5];
  Dog *p = new Dog[5];

  for (int i = 0; i < 5; i++)
  {
    d[i].setwe(3 * i);
    d[i].setag(i);
    p[i] = Dog(d[i]);
  }

  p[5]->showCnt();
  //^^^^^^^^^^^^^^ Error above
  for (int j = 0; j < 5; j++)
  {
    delete [] p;
  }
  return 0;
}

Версия 2:

int main() 
{  
  string a, b;
  int age;
  Dog d[5];
  Dog *p[5];

  for (int i = 0; i < 5; i++)
  {
    d[i].setwe(3 * i);
    d[i].setag(i);
    //p[i] = Dog(d[i]);
    p[i] = &d[i];
  }

  p[5]->showCnt();
  return 0;
}

Из того, что я понимаю, я мог написать неправильно в версии 1, но я хочу понять, почему p не рассматривается как указатель в версии 1?

Это подсказка, которую я получил из ошибки : базовый операнд '->' имеет тип указателя не 'Dog' .

Я также не уверен, что является лучшим способом (версия 1 или версия 2) для копирования массива объектов в объект указателя массив. Я хотел бы заранее извиниться, если я понял это неправильно. Спасибо.

1 Ответ

0 голосов
/ 28 марта 2020

p[5]->showCnt() нелегально, потому что ваш массив объектов имеет только 5 позиций, начиная с 0 и заканчивая на 4. Итак, вам просто нужно заменить p[5]->showCnt() на p[4]->showCnt().

О лучшем используемую версию, используйте версию 2, если вы хотите работать с размерами stati c, и используйте версию 1, если вы хотите динамически управлять p для работы с более чем 5 объектами в какой-то момент времени выполнения вашей программы. Краткий ответ: версия 1 лучше!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...