C ++通过引用传递和投射混淆

时间:2013-08-23 03:04:38

标签: c++ casting parameter-passing pass-by-reference

假设我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;

in .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;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我无法解释在您发布的代码中究竟发生了什么,但没有更多信息,但由于您的问题似乎已经解决,as per requested,使用指针向量很难做到正确并且应该仅用于某些情况,例如当你意识到可能会有巨大的性能提升(在测试之后)或你正在处理的类型是不可复制的等等。另外,在处理指针时,你必须格外注意对象的生命周期,正确的复制(深拷贝与浅拷贝),正确的比较(指针与实际对象之间的比较)并且很难做到正确。因此,请始终将对象直接存储在容器中,并在必要时更改为指针向量。