我正在将科学代码从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;
}
答案 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];
如果这是在所有模块看到的头文件中,那么您拥有的代码将正常工作。如果有任何一个地方将这些数组之一作为参数传递,那么可能必须重写函数原型和实现。