C ++将数组参数传递给函数

时间:2012-10-14 18:39:24

标签: c++ arrays pointers multidimensional-array

我想将一个数组的引用从一个对象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];,但这更令人困惑。

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

更新

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

没有框架只是Android-NDK。

6 个答案:

答案 0 :(得分:3)

我认为你陷入了一个经典的陷阱,即相信有人告诉你“C中的数组和指针是相同的”。

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

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

然后,您不必担心引用int数组与引用数组之间的混淆。

您的PersonModel随后包含引用至其中一个。

PathArray &path;

并且,因为它的引用必须在构造函数初始化列表中而不是在构造函数体中初始化。

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

当然,持有这样的引用有点可怕,所以你可能要考虑使用boost :: shared_ptr或类似的东西来改善生命周期管理。

答案 1 :(得分:2)

  1. 您不能像在C ++中使用值类型一样分配数组
  2. int path [x] [y]解析为int(*)[y]
  3. 类型

    可能的解决方案是:

    1. 使用memcpy / copy
    2. 使用std :: array

答案 2 :(得分:1)

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

PersonModel( int (*path)[FieldSize::HEIGHT][FieldSize::WIDTH], int permissionLevel );

答案 3 :(得分:0)

您无法分配到这样的数组。但是,你可以使用这样一个事实,即数组是一个连续的存储区,即使有一个数组数组,并使用例如memcpy复制数组:

memcpy(this->path, path, FieldSize::HEIGHT * FieldSize::WIDTH * sizeof(int));

答案 4 :(得分:0)

您必须将指针传递给2d阵列,因为您无法传递数组,如您在代码段中所述。 我建议使用STL数组类型。不可否认,std :: array是C ++ '11标准,因此旧编译器可能不支持它。你也可以使用更长时间的矢量。

vector<vector<int>>path;

您必须在构造函数中调整2d-vector的大小。 索引看起来有点滑稽:

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

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

答案 5 :(得分:-3)

在C ++中,'='为基本类型(如intdouble实现,但不适用于数组(数组不是基本类型),因此不应使用'='来指定数组新数组,而不是你应该用memcpy来复制数组。 memcpy将内存复制到另一个内存中,以便您可以使用它将数组复制到另一个数组上:

// memcpy( dst, src, size );
memcpy( this->path, path, FieldSize::HEIGHT * FieldSize * WEIGHT * sizeof(int) );