Передача массива указателей в другой класс - PullRequest
2 голосов
/ 06 апреля 2010

Я пытаюсь сделать следующее:

в main.cpp:

// Create an array of pointers to Block objects
Block *blk[64];
for (i=0; i<8; i++) {
  for (j=0; j<8; j++) {
    int x_low = i*80;
    int y_low = j*45;
    blk[j*8+i] = new Block(30, x_low+40.0f, y_low+7.5f, &b);
  }
}

И затем я пытаюсь передать его в созданный мной графический объект:

Graphics g(640, 480, &b, &p, blk[0], number_of_blocks);

графический конструктор выглядит следующим образом:

Graphics::Graphics(int width, int height, Ball *b, Paddle *p, Block *blk, int number_of_blocks) {

Если я посмотрю, что содержится в массиве из графического объекта, существует только первый элемент, а затем все остальные элементы находятся в гиперпространстве:

for (int i=0; i<64; i++) {
  printf("for block %d, %f, %f ", i, (_blk+(sizeof(_blk)*i))->_x_low, (_blk+(sizeof(_blk)*i))->_y_low);

  printf("blah %d\n", (_blk+(sizeof(_blk)*i)));

}

и если я посмотрю на адреса, они будут разными (6956552, а не 2280520, когда я проверяю адреса в основном классе, используя:

printf(" blah %d\n", &blk[j*8*i]);

Я уверен, чтодолжно быть что-то не так, я делаю что-то не так, как будто я скопировал первый элемент из массива blk на новый адрес при передаче в графический объект.

Имеет ли это смысл? Есть идеи?

Ура, Скотт

Ответы [ 4 ]

4 голосов
/ 06 апреля 2010

Если вы хотите передать весь массив, конструктор должен выглядеть так:

Graphics::Graphics(int width, int height, Ball *b, Paddle *p,
    Block **blk, int number_of_blocks)

и вы должны передать массив следующим образом:

Graphics g(640, 480, &b, &p, blk, number_of_blocks);
0 голосов
/ 06 апреля 2010

Из того, что я вижу, вы передаете первый элемент массива в конструктор, а не весь массив. Это то, что вы делаете:

#include <iostream>
#include <cstdlib>

void foo(int* item, const int length);

int main() {
  const int length = 10;
  int* array[length];
  for (int i = 0; i < length; ++i) {
    array[i] = new int(i + 100);
  }
  foo(array[0], length);
  return (EXIT_SUCCESS);
}

void foo(int* item, const int length) {
  for (int i = 0; i < length; ++i) {
    std::cout << item[i] << std::endl;
  }
}

Я считаю, что это то, что вы хотели сделать:

#include <iostream>
#include <cstdlib>

void foo(int** array, const int length);

int main() {
  const int length = 10;
  int* array[length];
  for (int i = 0; i < length; ++i) {
    int* item = new int(i + 100);
    array[i] = item;
  }
  foo(array, length);
  return (EXIT_SUCCESS);
}

void foo(int** array, const int length) {
  for (int i = 0; i < length; ++i) {
    int* item = array[i];
    std::cout << *item << std::endl;
  }
}

С уважением, Рафаэль.

0 голосов
/ 06 апреля 2010

Функция Graphics ожидает непрерывный массив Block объектов в памяти, и вы создаете каждый новый Block независимо. Попробуйте

Block* blk = new Block[64];

, затем выполните цикл и инициализируйте значения каждого Block. Это будет работать только в том случае, если вы можете инициализировать блочные объекты иначе, чем использовать конструктор с аргументами, поскольку new в этом случае может вызывать только конструктор по умолчанию. Если единственный способ инициализировать Block - использовать конструктор с аргументами, вам нужно будет сделать что-то еще, например, передать Block** в функцию.

0 голосов
/ 06 апреля 2010

Похоже:

Graphics::Graphics(int width, int height, Ball *b, Paddle *p, Block *blk, int number_of_blocks) {

ожидает массив блоков, а не массив указателей на блоки.Передача первого элемента, вероятно, сработает, если вы сделали made_number_of блоков 1, но он не может работать ни для чего другого, используя вашу текущую структуру данных.На вашем месте я бы отказался от использования массивов и использовал бы вместо этого std :: vector - это значительно упростит ваш код.

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