对象指针数组又返回一个值?

时间:2013-03-28 06:21:12

标签: c++ arrays object pointers

所以我有这个指针数组指向最多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()<<", ";
    }
}

这就是奇怪的东西开始发生的地方。因为该循环的输出是错误的,我编写了一个调试循环来查看paths数组中的内容: 考虑这种情况: 我运行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?

2 个答案:

答案 0 :(得分:0)

您需要将其声明为:

Instance* paths[4];

如果你想要4个元素(编号为0到3)。

答案 1 :(得分:0)

这里有多个假设导致你出现问题。

首先,你声明的数组只包含三个元素,而不是四个元素。

其次你在指针sizeof(current->getPaths())上使用sizeof()并希望得到数组大小,你反而得到的只是指针的大小(以字节为单位)。您可以编写一个方法来返回数组元素的数量,或者更好地使用向量来保存指针,这样当您需要大小时只需检查向量的大小

std::vector<Instance*> paths;

...

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

更好的是使用共享指针(std::shared_ptr)的向量,以便清除所有权并将清理代码保持在最低限度