C++中的二维数组对象 我正在把一个科学代码从java移植到C++。请告诉我:

C++中的二维数组对象 我正在把一个科学代码从java移植到C++。请告诉我:,c++,arrays,object,pointers,C++,Arrays,Object,Pointers,a这两个函数有什么问题? b我怎样才能解决这个问题?我可以像使用二维数组一样使用int**,但不能使用代理** 我收到此错误:没有运算符=与此操作数匹配 在普通C语言中,我们可以为指针赋值NULL。我们也可以使用一个类型**,比如二维数组,即[i][j]二维空间用于objectSpace,而agentSpace分配到其他地方 int** objectSpace; Agent** agentSpace; void Space::removeAgentAt(Point p)

a这两个函数有什么问题? b我怎样才能解决这个问题?我可以像使用二维数组一样使用int**,但不能使用代理**

我收到此错误:没有运算符=与此操作数匹配

在普通C语言中,我们可以为指针赋值NULL。我们也可以使用一个类型**,比如二维数组,即[i][j]二维空间用于objectSpace,而agentSpace分配到其他地方

    int** objectSpace;
    Agent** agentSpace;

    void Space::removeAgentAt(Point p)
    {
        agentSpace[p.x][p.y] = NULL;
    }

    void Space::putAgentTo(Agent agent, Point p)
    {
        agentSpace[p.x][p.y] = agent;
    }
agentSpace是指针,agentSpace[p.x]是指针,但agentSpace[p.x][p.y]不是指针

C++与Java不同;对象通常是通过值而不是引用来引用的。

agentSpace是指针,agentSpace[p.x]是指针,但agentSpace[p.x][p.y]不是指针


C++与Java不同;对象通常是按值引用的,而不是引用。

< p>猜测您需要为代理类定义赋值运算符。< /p> < p>猜想您需要为代理类定义赋值运算符。C++中的< /p> ,null只是0的别名。除非您对从整数到代理对象的转换进行了编码,否则无法为代理指定NULL

一种解决方案是创建一个虚拟代理对象,比如Agent-AgentNone;并使用它而不是NULL。如果您想检查代理对象是否等于AgtNo../P>>P> C++,NULL只是0的别名,那么您可能需要实现比较运算符。除非您对从整数到代理对象的转换进行了编码,否则无法为代理指定NULL


一种解决方案是创建一个虚拟代理对象,比如Agent-AgentNone;并使用它而不是NULL。如果要检查代理对象是否等于agentOne,可能必须实现比较运算符。

要使代码更容易与原始代码匹配,请提供数组维度:

int   objectSpace[100][200];   // but use the actual dimensions
Agent agentSpace[250][300];    // todo:  fix dimensions
更好的做法是使用定义的常量:

int   objectSpace[OS_X_MAX][OS_Y_MAX];
Agent agentSpace[AS_X_MAX][AS_Y_MAX];

如果这是所有模块都能看到的头文件,那么您的代码将正常工作。如果这些数组中有一个作为参数传递,则可能必须重写函数原型和实现。

为了使代码更容易与原始数组匹配,请提供数组维度:

int   objectSpace[100][200];   // but use the actual dimensions
Agent agentSpace[250][300];    // todo:  fix dimensions
更好的做法是使用定义的常量:

int   objectSpace[OS_X_MAX][OS_Y_MAX];
Agent agentSpace[AS_X_MAX][AS_Y_MAX];
如果这是所有模块都能看到的头文件,那么您的代码将正常工作。如果这些数组中有一个作为参数传递,那么函数原型和实现可能必须重写。

这样看,对于代理**agentSpace,第一个*可以访问数组的第一个维度,第二个*可以访问第二个维度

代理**是指向指针的指针,或者在您的情况下是指针数组。当您尝试执行agentSpace[p.x][p.y]=NULL时,您试图将NULL分配给编译器认为是类型为Agent的完整对象,您需要另一个间接级别:

Agent*** agentSpace = 
    {
         { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 },
         { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 },
         { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }
    };
如下所示,对于代理**agentSpace,第一个*允许您访问数组的第一个维度,第二个*允许您访问第二个维度

代理**是指向指针的指针,或者在您的情况下是指针数组。当您尝试执行agentSpace[p.x][p.y]=NULL时,您试图将NULL分配给编译器认为是类型为Agent的完整对象,您需要另一个间接级别:

Agent*** agentSpace = 
    {
         { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 },
         { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 },
         { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }
    };

奥利,我需要有一个代理数组,并修改该数组以显示代理在空间中的位置。你能给我一点建议或一个解决方案吗?@wmac你知道数组在编译时的维数,还是只知道在运行时的维数?您最好使用标准库容器。不幸的是,尺寸未知,但空间太大。它可能包含1000*1000个单元格。我认为这对于容器来说太多了。@wmac如果维度对于容器容器太大,向量向量向量似乎最适合您的用例,那么它们对于动态分配的数组来说太大了。奥利,我需要有一个代理数组,并修改数组以显示代理在空间中的位置。你能给我一点建议或一个解决方案吗?@wmac你知道数组在编译时的维数,还是只知道在运行时的维数?您最好使用标准库容器。不幸的是,尺寸未知,但空间太大。它可能包含1000*1000个单元格。我认为这对于容器来说太多了。@wmac如果维度对于容器容器来说太大,那么向量向量向量似乎最适合您的用例,那么对于动态分配的数组来说它们太大了。数组的大小未知。我在这个页面中使用了动态数组分配模板:@wmac那么我建议向量的向量方法我已经使用了这个方法来创建数组。它处理整数,如该页上的示例。但是ob
代理类型的对象不能与代理的二维动态数组一起使用。数组的大小未知。我在这个页面中使用了动态数组分配模板:@wmac那么我建议向量的向量方法我已经使用了这个方法来创建数组。它处理整数,如该页上的示例。但Agent类型的对象不能与二维动态Agent数组一起工作。