0

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

1 回答 1

0

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

于 2013-08-23T03:52:08.673 回答