我正在尝试执行以下操作:
在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数组中的第一项复制到传递给图形对象时的新地址一样。
这有意义吗?有什么想法吗?
干杯, 斯科特
答案 0 :(得分:4)
如果要传递整个数组,构造函数应如下所示:
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);
答案 1 :(得分:0)
看起来像:
Graphics::Graphics(int width, int height, Ball *b, Paddle *p, Block *blk, int number_of_blocks) {
期待一个Blocks数组,而不是一个指向Blocks的指针数组。如果你make_number_of块1,传递第一个元素可能会有效,但它不能用于使用当前数据结构的任何其他元素。如果我是你,我会放弃使用数组并使用std :: vector代替它 - 它将大大简化你的代码。
答案 2 :(得分:0)
Graphics
函数期待内存中连续的Block
个对象数组,并且您将独立创建每个新Block
。尝试
Block* blk = new Block[64];
然后循环并初始化每个Block
的值。这只有在你能够以另一种方式使用带有参数的构造函数初始化块对象时才有效,因为new
在这种情况下只能调用默认构造函数。如果初始化Block
的唯一方法是使用带参数的构造函数,则必须执行其他操作,例如将Block**
传递给函数。
答案 3 :(得分:0)
从我所看到的,您将数组的第一个元素传递给构造函数,而不是整个数组。这就是你在做的事情:
#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;
}
}
此致 拉斐尔。