我的程序包含一个类,其简化形式为:
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;
对我来说还没有清楚,为什么第二个版本引用了对象指针的指针,而不是对象。另外,我应该如何以正确的方式编写函数调用?
答案 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);
^
这意味着此函数将返回指向单位的指针。