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

Calling object function through object pointers

本文关键字:对象 函数 调用 指针      更新时间:2023-10-16

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

单位.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++在编译后写入:无法将参数2从"Units*"转换为"Units"-当然,因为DetectorField本身是指针的数组。然后我试着引用它指向的对象,这样:

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

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

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

要使此调用有效:

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 &参考。

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

&以这种方式出现时,它意味着the address of

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

你应该做的是这样称呼它:

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

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

或者将功能分离更改为:

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

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

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