0

我想将一个数组的引用从一个对象GameModel传递给另一个对象PersonModel,存储引用,然后在 PersonModel 中使用这个数组,就像在 GameModel 中一样,但是......

我对传递数组过程有一个可怕的误解:在类中PersonModel,我想在构造函数中通过引用传递数组(参见下面的代码块)。但是标记的行会引发编译错误

    PersonModel::PersonModel( int path[FieldSize::HEIGHT][FieldSize::WIDTH], int permissionLevel ) { 
        this->path = path; //<------ ERROR here:
        //PersonModel.cpp:14:22: error: incompatible types in assignment of 'int (*)[30]' to 'int [31][30]'

        this->permissionLevel = permissionLevel;
    }

这是头文件PersonModel.h

#ifndef PERSON_MODEL
#define PERSON_MODEL

#include "data/FieldSize.h"

namespace game{
    class IntPosition;
    class MotionDirection;

    class PersonModel {
        protected:
        int path[FieldSize::HEIGHT][FieldSize::WIDTH];
        int permissionLevel;

        public:
        PersonModel( int path[FieldSize::HEIGHT][FieldSize::WIDTH], int permissionLevel );
        void setMotionDirection ( MotionDirection* md);
        void step(long time);
        void reset(long time);
    };
}

#endif 

正如我现在所看到的,我可以将int path[FieldSize::HEIGHT][FieldSize::WIDTH];声明更改为,int (*path)[FieldSize::WIDTH];但它更加混乱。

帮助我理解这个主题:将传递的引用存储到数组以供以后使用的正确方法是什么,就像通常的二维数组一样。

更新:

该数组是由位掩码表示的游戏字段图块属性的映射,因此它实际上是只读的。类的所有封装对象都GameModel应该读取这个数组,但我绝对不想复制它或添加一些额外的功能。

没有框架,只有裸 Android-NDK。

4

6 回答 6

3

我认为您已经陷入了相信某人告诉您“C 中的数组和指针是相同的”的经典陷阱。

我要做的第一件事是为数组定义一个类型:

typedef int PathArray[FieldSize::HEIGHT][FieldSize::WIDTH];

然后,您无需担心对整数数组的引用与对整数的引用数组之间的混淆。

然后,您的 PersonModel 包含对其中之一的引用

PathArray &path;

并且,因为它是一个引用,所以它必须在构造函数初始化列表中进行初始化,而不是在构造函数体中。

 PersonModel::PersonModel( PathArray &aPath, int aPermissionLevel ) :
   path(aPath),
   permissionLevel(aPermissionLevel)
 {
 }

当然,持有这样的引用有点吓人,因此您可能需要考虑使用 boost::shared_ptr 或类似的东西来使生命周期管理更加健壮。

于 2012-10-14T19:12:40.877 回答
2
  1. 不能像在 C++ 中使用值类型那样分配数组
  2. int path[x][y] 解析为 int (*)[y] 类型

可能的解决方案是:

  1. 使用 memcpy/复制
  2. 使用 std::array
于 2012-10-14T18:46:55.153 回答
0

数组的名称是第一个元素上的指针,所以,你可以试试

PersonModel( int (*path)[FieldSize::HEIGHT][FieldSize::WIDTH], int permissionLevel );
于 2013-12-28T23:31:33.493 回答
0

您不能分配给这样的数组。但是,您可以使用数组是一个连续的内存区域这一事实,即使有一个数组数组,也可以使用例如memcpy复制数组:

memcpy(this->path, path, FieldSize::HEIGHT * FieldSize::WIDTH * sizeof(int));
于 2012-10-14T18:43:09.350 回答
0

您必须将指针传递给二维数组,因为您不能像代码片段中所述那样传递数组。我建议使用 STL 数组类型。诚然 std::array 是 C++ '11 标准,因此旧编译器可能不支持它。您也可以使用已经存在较长时间的矢量。

vector<vector<int>>path;

您将不得不在构造函数中调整二维向量的大小。索引看起来有点滑稽:

path[1].[1] ....

使用向量,您可以通过引用传递它。

于 2012-10-14T21:56:57.870 回答
-3

在 C++ 中,'=' 是为原始类型实现的intdouble但不适用于数组(数组不是原始类型),所以你不应该使用 '=' 将数组分配给新数组,而应该使用一些东西memcpy来复制数组。memcpy将内存复制到另一个内存,因此您可以使用它将数组复制到另一个数组:

// memcpy( dst, src, size );
memcpy( this->path, path, FieldSize::HEIGHT * FieldSize * WEIGHT * sizeof(int) );
于 2012-10-14T18:45:46.097 回答