【问题标题】:Passing temporary objects by reference通过引用传递临时对象
【发布时间】:2019-03-02 21:23:18
【问题描述】:

我有两个课程: 圆和点

类 Circle 包含一个 Dot,而 Dot 包含一个 int。 Circle 有一个 getDot() 函数,Dot 有一个 lessThan(Dot& ) 函数。

我想通过 Dot 中的 int 值对一个 Circles 数组 elems[] 进行排序。如果我有一个要与数组中的某个值进行比较的 Circle circ,我基本上需要一行来执行以下操作:

elems[0].getDot().lessThan(circ.getDot())

但它不会编译...我可以通过临时解决这个问题

Dot dt = circ.getDot()

路过

elems[0].getDot().lessThan(dt)

但这似乎是不必要的复制。有没有更有效的方法来解决这个问题?

不幸的是,我仅限于使用lessThan(dot&)进行比较,但我可以修改它的内容。

编译器错误是: 错误:从“Dot”类型的右值 cout

【问题讨论】:

  • 为什么它需要一个 non const 引用呢?
  • 如果 lessThan 的参数是一个引用,你就没有复制它。此外,通常会省略初始构造/分配。净效果应该与使用临时的相同(除了 dt 明确在范围内)
  • 你能把函数改成Dot const&吗?
  • 我明白了,我不知道 const 和 non-const 引用之间的区别。谢谢大家!

标签: c++ arguments pass-by-reference temporary-objects


【解决方案1】:

示例:

#include <vector>
#include <algorithm>

struct Dot
{
    Dot(int i) : value_(i) {}
    bool lessThan(Dot const& other) const
    {
        return value_ < other.value_;
    }

    int value_;
};

struct Circle
{
    Circle(Dot dot = Dot(0))
    : dot_(dot)
    {
    }

    const Dot& getDot() const { return dot_; }

    Dot dot_;
};


void sortCircles(std::vector<Circle>& circles)
{
    auto order = [](Circle const& l, Circle const& r)
    {
        return l.getDot().lessThan(r.getDot());
    };
    std::sort(circles.begin(), circles.end(), order);
}

【讨论】:

  • @Fib011 诀窍通常在于为您的对象提供 const 访问器方法。
猜你喜欢
  • 2017-09-11
  • 2012-06-23
  • 2011-07-06
  • 2012-07-07
  • 2012-01-05
  • 2012-07-16
  • 2011-12-12
  • 2013-11-24
相关资源
最近更新 更多