0

したがって、同じ基本クラスの最大 4 つのオブジェクトを指すこのポインター配列があります。

private:
    Instance* paths[3];

指し示すオブジェクトがある場合は、配列のスロットにポインターを割り当てます。指すものが何もない場合は NULL です。

私はそれを行うためにこのセット関数を持っています:

void Instance::setNearbyObjects(Instance* north,Instance* east,Instance* south,Instance* west)
{
    paths[0]=north;
    paths[1]=east;
    paths[2]=south;
    paths[3]=west;
}

パス配列を返すだけのこの get 関数もあります。

Instance* Instance::getPaths()
{
    return *paths;
}

次に、for ループを使用してその配列を循環させ、NULL が含まれていないスロットを見つけようとします。それに基づいて、特定のものをユーザーに出力します。

string nesw[4] = {"(N)orth","(E)ast","(S)outh","(W)est"};
for(int i=0;i<=(sizeof(current->getPaths());i++)
{
    if(current[i].getPaths()!=NULL)
    {
        cout<<nesw[i].c_str()<<", ";
    }
}

そこから奇妙なことが起こり始めました。そのループの出力は間違っていたので、パス配列の内容を確認するためにデバッグ ループを作成しました。次のシナリオを考えてみましょう: setNearbyObjects() 関数を実行して、このデータをパス配列に割り当てます。

current->setNearbyObjects(NULL,objPointerA,objPointerB,NULL);

次に、このループを実行して出力をコンソール画面に出力します。

for(int i=0;i<=sizeof(current->getPaths());i++)
{
    cout<<current[i].getPaths()<<endl;
}

私が期待した出力は次のようなものでした:

00000000
ABABABAB
007E8F28
00000000

しかし、実際には次のとおりでした。

00000000
ABABABAB
007E8F28
00000001
ABABABAB

パス配列の長さは [3]、4 スロットです。ループが 5 つのアドレスを返すのはなぜですか? また、確かに NULL に設定したのに、4 番目のアドレスが null ではないのはなぜですか?

4

2 に答える 2

0

ここには、問題を引き起こしている複数の仮定があります。

まず、宣言されている配列は、4 つではなく 3 つの要素のみを保持します。

次に、ポインタに対して sizeof() を使用sizeof(current->getPaths())し、配列サイズを取得することを期待します。代わりに返されるのは、バイト単位のポインタのサイズです。代わりに、配列要素の数を返すメソッドを作成するか、ベクトルを使用してポインターを保持することをお勧めします。サイズが必要な場合は、ベクトルのサイズを確認するだけです

std::vector<Instance*> paths;

...

paths.push_back(north);
paths.push_back(east);
paths.push_back(south);
paths.push_back(west);

さらに良いのは、共有ポインターのベクトルを使用し(std::shared_ptr)て所有権を明確にし、クリーンアップ コードを最小限に抑えることです。

于 2013-03-28T06:31:13.947 に答える
0

次のように宣言する必要があります。

Instance* paths[4];

4 つの要素 (0 から 3 までの番号) が必要な場合。

于 2013-03-28T06:24:06.477 に答える