2013-03-28 53 views
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; 
} 

我也有这个获取函数,仅仅返回路径数组:

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?

+1

当声明是'[3]'仅存在3个时隙,而不是4.您正在访问数组之外​​,这会导致未定义的行为。 – Barmar 2013-03-28 06:23:11

+0

你的调试循环没有任何意义。 'current'不是一个数组,为什么你使用'current [i] .getPaths()'? – Barmar 2013-03-28 06:38:04

+0

因为... current-> getPaths()[i]给了我一个错误。我尝试过这个。我看不到使用current [i] - > getPaths()的逻辑。 – eltaro 2013-03-28 09:05:57

回答

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)的矢量,以便使所有权清楚和清理代码保持为最小

+0

^好的。我会尽力实现这一点。 – eltaro 2013-03-28 06:37:31

0

您需要将其声明为:如果你要4元(到3编号为0)

Instance* paths[4]; 

+0

为什么?例如。在C#中,如果你想要4个插槽,你可以声明路径[3]。这里为什么不同? – eltaro 2013-03-28 06:26:13

+0

好的。我将声明更改为Instance * paths [4]。再次运行循环,然后...返回5个项目still = _ =其中NULL指针的位置不是预期的位置。 – eltaro 2013-03-28 06:28:22

+0

我对C#不是很熟悉。但这[阵列教程](http://msdn.microsoft.com/en-us/library/aa288453(V = vs.71)的.aspx)没有显示在阵列的声明在所有尺寸。 – Barmar 2013-03-28 06:29:18