2012-05-24 74 views
1

我正在将科学代码从Java迁移到C++。请告诉我:
C++中对象的二维数组

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

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

在正常的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; 
    } 

回答

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

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

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

+0

奥利,我需要有代理人的数组和修改数组以示出在该空间是代理。 你能不能给一点意见或善意的解决方案? – wmac

+0

@wmac你知道编译时的数组维数,还是只在运行时?使用标准库容器可能会更好。 – juanchopanza

+0

不幸的是尺寸未知,但空间太大。它可能包含1000 * 1000个单元格。我认为这对于容器来说太过分了。 – wmac

0

你猜是否需要为你的Agent类定义一个赋值操作符?

1

在C++中,NULL仅仅是0的别名。除非您已将整数编码转换为Agent对象,否则不能将NULL分配给Agent

一种解决方案是制作一个虚拟Agent对象,如Agent AgentNone;并使用该对象代替NULL。如果您想检查Agent对象是否等于AgentNone,则可能必须实施比较运算符。

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

如果这是一个头文件所有模块都可以看到,那么您拥有的代码将会正常工作。如果有其中这些阵列中的一个作为参数传递的任何地方,那么函数原型和实施可能会被改写。

+0

数组的大小未知。我在这个页面中使用动态数组分配模板:http://www.codeproject.com/Articles/21909/Introduction-to-dynamic-two-dimensional-arrays-in – wmac

+1

@wmac然后我会建议矢量方法 – juanchopanza

+0

我已经使用该方法来创建数组。它适用于整数(如该页面上的示例)。但类型Agent的对象不能与Agent的二维动态数组一起工作。 – wmac