【问题标题】:Two dimensional array of objects in C++C ++中的二维对象数组
【发布时间】:2012-05-24 07:41:30
【问题描述】:

我正在将科学代码从 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;
    }

【问题讨论】:

    标签: c++ arrays object pointers


    【解决方案1】:

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

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

    【讨论】:

    • 奥利,我需要一个代理数组并修改数组以显示代理在空间中的位置。您能否提供一些建议或解决方案?
    • @wmac 你知道数组在编译时的维度,还是只在运行时知道?使用标准库容器可能会更好。
    • 不幸的是尺寸未知,但空间太大。它可能包含 1000*1000 个单元格。我认为这对容器来说太多了。
    • @wmac 如果尺寸对于容器容器来说太大(向量向量似乎最适合您的用例),那么它们对于动态分配的数组来说太大了。
    【解决方案2】:

    这样看,对于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】:

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

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

      【讨论】:

        【解决方案4】:

        您是否需要为您的 Agent 类定义一个赋值运算符?

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

          • 数组的大小未知。我在此页面中使用动态数组分配模板:codeproject.com/Articles/21909/…
          • @wmac 那么我会建议向量方法的向量
          • 我已经使用该方法创建了数组。它适用于整数(如该页面上的示例)。但是 Agent 类型的对象不能与 Agent 的二维动态数组一起使用。
          猜你喜欢
          • 2019-04-13
          • 1970-01-01
          • 2014-06-11
          • 2014-04-14
          • 2021-04-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-23
          相关资源
          最近更新 更多