通过对象指针调用对象函数

时间:2013-07-20 00:13:27

标签: c++ arrays object pointers

我的程序包含一个类,其简化形式为:

Units.h:

#define fullwidth 200
#define fullheight 200

class Units
{
public:

[...]

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

它定义了一个函数,它接受两个参数作为输入:一个对象指针数组,用于"单位"对象,以及一个特殊的选择"单位"对象

这是主要部分:

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

它创建&#34;单元&#34;对象指针是&#34;单位&#34;中的函数所必需的。并在一开始就将所有这些值设置为NULL。

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

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

对于此版本,Visual C ++在编译后写入:无法转换参数2来自&#39; Units *&#39;到&#39;单位&#39; - 当然,因为DetectorField本身就是指针的数组。然后我尝试引用它指向的对象,这样:

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

MSVC在编译后写入:无法从&#39;单位**&#39;转换参数2到&#39;单位&#39;

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

3 个答案:

答案 0 :(得分: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 &参考。

答案 1 :(得分:1)

数组中元素的类型为Units*。你这样说:Units* Detector[fullwidth][fullheight] - 一个Units*的二维数组。 Units*的地址是Units**类型。

答案 2 :(得分:1)

  

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

&以这种方式表示时,它意味着the address of

  

“另外,我应该如何以正确的方式编写函数调用?”

你应该做什么,或者这样称呼:

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

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

或者将功能声明更改为:

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

这意味着此函数将返回指向单位的指针。