Указатель создан, затем устанавливается равным индексу в массиве, но получает разные значения - PullRequest
0 голосов
/ 12 января 2019

Создал массив типа RectangleShape в SFML и создал указатель формы Rectangle с помощью ключевого слова «new», затем установил индекс массива, равный значению указателя. Когда я хочу получить такую ​​информацию, как положение, и затем я перемещаю форму и затем вызываю ее функцию getPosistion (), я получаю только значения того места, где я ее первоначально вызывал, но когда я вызываю ее из индекса в массиве, я получаю обновлены координаты.

head = new RectangleShape();
head->setPosition(250, 250);
snake = new RectangleShape[_size]; //_size is set to 10 
snake[0] = *head;
//do some movement to the object via calling 
snake[0].move(...);

//then calling the positions
cout << "head: " << head->getPosition().x << " , " << head->getPosition().y << endl;

cout << "snake[0]: " << snake[0].getPosition().x << " , " << 
snake[0].getPosition().y << endl;
//I will only get the correct position from calling snake[0] but not  head->...

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Ключевое слово new выполняет две операции: выделение и инициализация .

Когда вы вызываете new RectancleShape(), сначала выделяет памяти в куче для хранения одного экземпляра RectangleShape, а затем вызывает конструктор для инициализации этой памяти.

При вызове new RectangleShape[_size] он выделит память в куче для хранения _size экземпляров RectangleShape и инициализирует их конструктором по умолчанию.

В вашем сценарии вы не хотите выполнять оба этих распределения. Вы либо хотите выделить память в массиве, либо хотите выделить и инициализировать каждый экземпляр отдельно, а затем сохранить указатели в массиве.

Вместо выделения нового экземпляра и указания на него head, сначала выделите массив, затем укажите head на первый элемент snake.

0 голосов
/ 12 января 2019

snake[0] - это отдельный объект, первоначально инициализированный как копия *head. После этого они независимы и не связаны между собой.

...