C ++将二维数组作为参数传递给类

时间:2009-10-10 11:47:12

标签: c++ multidimensional-array

我有一个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构造函数中的行。

我做错了什么?

6 个答案:

答案 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。