我有一个Car类和一个Track类。 Car类构造函数采用road参数,该参数应该是32x32布尔数组。然后我有一个Track类创建一个Car类,并且应该将32x32数组传递给它的构造函数。
请注意,我通过删除不相关的部分来简化代码。
class Car : public WorldObject
{
private:
bool _road[32][32];
public:
Car(bool road[32][32])
{
_road = road;
}
};
class Track : public WorldObject
{
public:
bool _road[32][32];
Track()
{
Car* _car = new Car(this->_road);
_car->Position.X = 50;
_car->Position.Y = 50;
ChildObjects.push_back(_car);
}
};
这不会编译......我收到错误:
错误1错误C2440:'=':无法从'bool [] [32]'转换为'bool [32] [32]'
在_road = road; Car构造函数中的行。
我做错了什么?
答案 0 :(得分:4)
在C / C ++中,除了数组之外,每个参数都按值传递 - 它们通过引用传递。这意味着在您的情况下:构造函数的签名必须如下所示:
Car(bool (*road)[32]);
这意味着:road
是一个指向32个布尔数组的指针(要获得更多信息,请阅读litb的answer到相关问题。)现在,如果你写的话
_road = road
将指针road
的值复制到变量_road
。这被编译器拒绝,因为_road
不是指针,它是布尔数组的数组。有关数组及其值的更多信息,请阅读this。要解决此问题,您必须手动将_road
的元素复制到road
。类似下面的代码可以解决您的问题:
for (int i=0;i<32;++i)
for (int j=0;j<32;++j)
_field[i][j] = field[i][j];
答案 1 :(得分:3)
为了给出一个简约的答案,你唯一错误的就是你试图将一个数组分配给另一个数组。它真的与任何“传球”有关,正如你似乎相信的那样(根据你的问题主题判断)。
(是的,我知道,那个有问题的任务中的RHS实际上并不是一个阵列,但这是一个不同的故事)。
请记住,在C ++数组中不可分配而不是 copy-constructible 。例如,此代码
int a[10], b[10] = {};
a = b;
出于同样的原因,是不正确的。无论您是否在某处“传递”它们,都无法分配数组。
编译器通常会响应一条涉及指针的错误消息,这是所谓的“数组类型衰减”的结果,其他人已经在之前的回复中提到过(读过它)。
由于您无法分配数组,因此在这种情况下要复制数组,您需要手动执行,逐个元素,如
for (i = 0; i < 32; ++i)
for (j = 0; j < 32; ++j)
_road[i][j] = road[i][j];
或者你可以在几个不同的人中使用'memcpy'
1. memcpy(_road, road, 32 * 32 * sizeof **_road);
2. memcpy(_road, road, 32 * sizeof *_road);
3. memcpy(_road, road, sizeof _road);
还有更多的替代方法。
请注意,前面提到的“数组类型衰减”确实发生在这种情况下(一如既往),但它对您来说是透明的,即如果您执行手动的每元素复制,则无需了解所有内容,如上面的例子所示。
答案 2 :(得分:1)
构造强>
将数组传递给代码中的构造函数是有效的。但这里有一个小问题需要注意,你可以传递任何二维数组bool类型为原始大小32.这是你的成员变量Track :: _ road不会产生任何错误,即使它被声明为bool _road [16] [32];这可能会导致内存异常。要避免此问题,应将函数参数指定为对32x32维数组的引用,如下所示。
Car(bool (&road)[32][32])
{
}
您可以按如下方式访问函数内的值。
_road[i][j] = road[i][j];
您可以按如下方式创建班级的新实例。
Car* _car = new Car(this->_road);
<强>分配:强>
在C / C ++中,您无法直接将数组复制到另一个数组。您必须单独复制每个元素。您可以按如下方式使用for循环,或使用某些库函数进行复制。
for( i = 0; i < 32; i++ )
{
for( j = 0; j < 32; j++ )
{
_road[i][j] = road[i][j];
}
}
答案 3 :(得分:1)
你无法复制那样的数组。其他人已经更详细地讨论了这个问题,包括替代的循环个人分配和memcpy解决方案。
另一个解决方案是将数组包装在struct中。可以像这样复制结构。
E.g:
struct RoadStruct
{
bool road[32][32];
};
class Car : public WorldObject
{
private:
RoadStruct _road;
public:
Car(const RoadStruct & road )
{
_road = road;
}
};
虽然像这样复制会更有效:
public:
Car(const RoadStruct & road )
: _road ( road )
{}
(当然会创建2个RoadStruct数据集。如果你只想要一个共享数组,可以安排......)
答案 4 :(得分:1)
在C ++中,您可以使用标准库来获取比bool var[n]
更多功能的数组。尝试vector< vector< bool > > road( 32, 32 );
这将是一个可以传递给函数并根据需要分配的对象。
但是,从概念上讲,您可以考虑将_road
数据从Track
关联到Car
,而不是将其复制到vector< vector< bool > > const &_road;
和
public:
Car( vector< vector< bool > > const &road )
: _road = road;
{
}
};
答案 5 :(得分:-3)
bool road [32] [32]无效。
那里应该有一个逗号或者应该删除bool。