gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:53:14 25 4
gpt4 key购买 nike

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

我对传递数组过程有一个可怕的误解:在类 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] ; 但它更令人困惑。

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

更新:

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

没有框架只是裸露的 Android-NDK。

最佳答案

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

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

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

这样您就不必担心对整数数组的引用与对整数的引用数组之间的混淆。

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

PathArray &path;

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

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

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

关于C++将数组参数传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12885293/

25 4 0