【问题标题】:C++ passing by reference and casting confusionC++ 引用传递和转换混淆
【发布时间】: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-&gt;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-&gt;getName().at(f) 可能不是有效索引。您是否还注意到向量中的指针地址都相同(它们都指向同一个东西)?
  • @JesseGood - 我确实注意到了这一点,我正试图找出原因。这似乎不对。
  • 拥有一个向量指针很难做到正确。使用对象向量要容易得多,即std::vector&lt;V&gt;。另外,请在致电_v-&gt;getName().at(f)之前检查是否f &lt; _v-&gt;getName().size(),这可能是您的问题的原因。
  • 让我看看。我也发布了更新
  • 不错@JesseGood,在这里使用指针的理由为零。我删除了使它只是一个对象的向量,一切都如预期的那样。你明白他们为什么会这样做吗?我想不可能说出来。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-11-12
    • 1970-01-01
    • 2012-07-06
    • 2018-12-27
    • 1970-01-01
    • 2016-05-02
    • 2019-05-05
    • 2016-08-18
    • 1970-01-01
    相关资源
    最近更新 更多