C ++中的二维对象数组

时间:2012-05-24 07:41:30

标签: c++ arrays object pointers

我正在将科学代码从Java迁移到C ++。请告诉我:

a)这两个功能有什么问题?
b)我该如何解决这个问题?我可以像int**一样使用二维数组,但不能使用Agent**

我收到此错误:“No operator =匹配此操作数”

在普通的C中,我们可以为指针指定NULL。我们还可以使用type**类似二维数组(即a[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;
    }

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

在C ++中,NULL只是0的别名。除非您已将整数转换为Agent个对象,否则无法将NULL指定给Agent

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

答案 2 :(得分:1)

对此类似,对于Agent** agentSpace,第一个*可让您访问数组的第一个维度,第二个*可让您访问第二个维度。< / p>

Agent**是一个指向指针的指针 - 或者在你的情况下是一个指针数组。当您尝试执行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 }
    };

答案 3 :(得分:0)

您猜需要为Agent类定义赋值运算符吗?

答案 4 :(得分:0)

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

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];

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