5

私のプログラムにはクラスが含まれています。簡略化された形式は次のとおりです。

Units.h:

#define fullwidth 200
#define fullheight 200

class Units
{
public:

[...]

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

入力として 2 つの引数を取る関数を定義します。「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 に設定します。

その後、ランダムに選択された 1 つのポインターを介してオブジェクトの関数を呼び出そうとします。明らかに、ポインターが 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' に変換できません

2番目のバージョンがオブジェクトではなくオブジェクトポインターのポインターを参照する理由は明確ではありません。また、正しい方法で関数呼び出しをどのように記述すればよいですか?

4

3 に答える 3

2

この呼び出しを有効にするには:

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

2 番目の引数は、次の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

「なぜ 2 番目のバージョンがオブジェクトではなく、オブジェクト ポインターのポインターを参照しているのか、私には明らかではありません。」

がこのように現れる場合&は、 を意味し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 に答える
1

配列内の要素の型は ですUnits*。次のように宣言しました: Units* Detector[fullwidth][fullheight]- の 2 次元配列Units*。a のアドレスUnits*は typeUnits**です。

于 2013-07-20T00:23:26.017 に答える