5

我的程序包含一个类,这是它的简化形式:

单位.h:

#define fullwidth 200
#define fullheight 200

class Units
{
public:

[...]

void MovingUp(Units* Detector[fullwidth][fullheight], Units Self);
[...]
}

它定义了一个函数,该函数接受两个参数作为输入:“Units”对象的对象指针数组和一个特殊选择的“Units”对象。

这是主要部分:

#include "Units.h"

[...]

int i,j;
Units* DetectorField[fullwidth][fullheight];
Units Examples[20];

for (j=0;j<fullheight;j++)
{
    for (i=0;i<fullwidth;i++)
    {
        DetectorField[i][j] = NULL;
    }
}

它创建了“Units”中的函数所必需的“Units”对象指针数组,并在开始时将所有这些值设置为 NULL。

之后,我尝试通过一个随机选择的指针调用对象的函数。显然,如果指针指向 NULL,则调用是不可能的,但 Visual C++ 甚至在我运行程序之前就显示错误。

DetectorField[12][12]->MovingUp(DetectorField,DetectorField[12][12]);

对于这个版本,Visual C++ 在编译后写道: cannot convert parameter 2 from 'Units *' to 'Units' - 当然,因为DetectorField它本身是一个指针数组。然后我尝试以这种方式引用它指向的对象:

DetectorField[12][12]->MovingUp(DetectorField,&DetectorField[12][12]);

MSVC 编译后写入:无法将参数 2 从 'Units **' 转换为 'Units'

我不清楚为什么第二个版本引用对象指针的指针,而不是对象。另外,我应该如何以正确的方式编写函数调用?

4

3 回答 3

2

要使此调用有效:

DetectorField[12][12]->MovingUp(DetectorField, DetectorField[12][12]);

第二个参数必须是如下Unit *类型:

class Unit
{
  // ...
  void MovingUp(Units* Detector[fullwidth][fullheight], Units *Self);
};

如果您想保持Unit::MovingUp原样,请将您的呼叫更改为:

DetectorField[12][12]->MovingUp(DetectorField, *DetectorField[12][12]);

请注意,您在此处按值传递 Unit 。如果你有其他继承自 Unit 的类,你就有对象切片的风险。我建议至少更改它以供Unit &参考。

于 2013-07-20T00:29:41.983 回答
1

数组中元素的类型是Units*. 您这样声明:Units* Detector[fullwidth][fullheight]- 的二维数组Units*。a 的地址Units*是 type Units**

于 2013-07-20T00:23:26.017 回答
1

“我不清楚,为什么第二个版本引用对象指针的指针,而不是对象。”

&以这种方式出现时,它的意思是the address of

“还有,我应该如何正确地编写函数调用?”

你应该这样做要么这样称呼它:

DetectorField[12][12]->MovingUp(DetectorField,*DetectorField[12][12]);
                                              ^

这意味着 DetectorField[12][12] 指向的值(因为它是一个指针数组)。

或者将函数声明更改为:

void MovingUp(Units* Detector[fullwidth][fullheight], Units* Self);
                                                           ^

这意味着这个函数将接收一个指向单位的指针。

于 2013-07-20T00:28:57.133 回答