【发布时间】:2013-08-23 03:04:38
【问题描述】:
假设我有Object o,其中包含一个定义为:
std::vector<V *> V;
我有一个吸气剂:
inline std::vector<V *>& getV() { return V; };
如果我通过引用传递参数:
void A::function(Object& o)
并尝试访问 std::vector V 中的项目;
我应该怎么做?
void A::function(Object& _o)
{
for (int f=0; f < _o.getV().size(); f++)
{
V* _v = _o.getV().at(f);
std::string s = _v->getName().c_str();
std::cout << "V: " << _v->getName().at(f) << std::endl;
std::cout << "V: " << s << std::endl;
}
}
}
如果我在尝试访问上面的_v->getName() 时崩溃了,我会犯什么错误。
如果我查看崩溃,我确实看到 _v 的职位已满:
V std::__1::vector<V *, std::__1::allocator<V *> > size=8
[0] V * 0xbfffd658 0xbfffd658
[1] V * 0xbfffd658 0xbfffd658
[2] V * 0xbfffd658 0xbfffd658
[3] V * 0xbfffd658 0xbfffd658
[4] V * 0xbfffd658 0xbfffd658
[5] V * 0xbfffd658 0xbfffd658
[6] V * 0xbfffd658 0xbfffd658
[7] V * 0xbfffd658 0xbfffd658
更新:看来之前的开发者曾经做过类似的事情
在 .h 中
Object* o1;
在.a cpp中
void B::function(Object& _o)
{
o1 = &_o;
.... does stuff with o1 .....
}
在另一个 .cpp 中传入原始的 object o 来处理它:
void A::function(Object& _o)
{
for (int f=0; f < _o.getV().size(); f++)
{
V* _v = _o.getV().at(f);
std::string s = _v->getName().c_str();
std::cout << "V: " << _v->getName().at(f) << std::endl;
std::cout << "V: " << s << std::endl;
}
}
}
【问题讨论】:
-
很难说,但你有未处理的异常吗?
_v->getName().at(f)可能不是有效索引。您是否还注意到向量中的指针地址都相同(它们都指向同一个东西)? -
@JesseGood - 我确实注意到了这一点,我正试图找出原因。这似乎不对。
-
拥有一个向量指针很难做到正确。使用对象向量要容易得多,即
std::vector<V>。另外,请在致电_v->getName().at(f)之前检查是否f < _v->getName().size(),这可能是您的问题的原因。 -
让我看看。我也发布了更新
-
不错@JesseGood,在这里使用指针的理由为零。我删除了使它只是一个对象的向量,一切都如预期的那样。你明白他们为什么会这样做吗?我想不可能说出来。
标签: c++ casting parameter-passing pass-by-reference