したがって、同じ基本クラスの最大 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 ではないのはなぜですか?