1

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

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

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

在普通的 C 语言中,我们可以将 NULL 分配给指针。我们也可以使用type**类似二维数组(即a[i][j])(二维空间用于objectSpaceagentSpace分配到其他地方)。

    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;
    }
4

5 回答 5

3

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

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

于 2012-05-24T07:43:37.910 回答
1

在 C++ 中,NULL只是0. 除非您已编码从整数到Agent对象的转换,否则您不能分配NULLAgent.

一种解决方案是制作一个虚拟Agent对象,喜欢Agent AgentNone;并使用它而不是NULL. 如果要检查Agent对象是否等于 ,则可能必须实现比较运算符AgentNone

于 2012-05-24T07:46:04.693 回答
1

像这样看它,因为Agent** agentSpace,第一个*让您可以访问数组的第一个维度,第二个*让您可以访问第二个维度。

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 }
    };
于 2012-05-24T08:03:47.900 回答
0

你猜你需要为你的 Agent 类定义一个赋值运算符吗?

于 2012-05-24T07:44:49.887 回答
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];

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

于 2012-05-24T07:49:58.763 回答