【问题标题】:Object pointer array returns one more value?对象指针数组又返回一个值?
【发布时间】:2013-03-28 06:21:11
【问题描述】:

所以我有这个指针数组,它最多指向同一个基类的 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

paths数组的长度为[3],4个槽。为什么循环返回 5 个地址?还有为什么第四个地址不为空,而我肯定设置为NULL?

【问题讨论】:

  • 当声明为 [3] 时,只有 3 个插槽,而不是 4 个。您正在数组外部访问,这会导致未定义的行为。
  • 您的调试循环没有任何意义。 current 不是数组,为什么要用current[i].getPaths()
  • 因为... current->getPaths()[i] 给了我一个错误。我尝试过这个。我看不到使用 current[i]->getPaths() 背后的逻辑。

标签: c++ arrays object pointers


【解决方案1】:

这里有多种假设会导致您遇到问题。

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

第二次你在指针 sizeof(current-&gt;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) 以明确所有权并将清理代码保持在最低限度

【讨论】:

  • ^好的。我会尝试实现这一点。
【解决方案2】:

您需要将其声明为:

Instance* paths[4];

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

【讨论】:

  • 为什么?例如。在 C# 中,如果您想要 4 个插槽,您将声明路径 [3]。为什么这里不一样?
  • 好的。我将声明更改为 Instance* paths[4]。再次运行循环......它仍然返回 5 个项目 =_= 其中 NULL 指针的位置不是预期的。
  • 我对 C# 不是很熟悉。但是这个array tutorial 根本没有在数组声明中显示大小。
  • @eltaro:你不知道你在说什么。 C# 中的数组与 CC++ 类似,括号中的数字是元素的数量,索引从零开始。
  • 这是错误的,sizeof(current-&gt;getPaths())。 getPaths 返回一个指针,指针的字节大小为 4,与指针指向的元素数量无关。既然您知道数组中有四个项目,为什么不直接写for(int i=0;i&lt;4;i++)。最后,C++ 和 C# 非常不同。如果你尝试像编写 C# 一样编写 C++,你会犯很多很多错误。
猜你喜欢
  • 2016-05-01
  • 1970-01-01
  • 2017-12-26
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-16
相关资源
最近更新 更多