从常量对象引用到指针

时间:2014-06-18 09:30:12

标签: c++

在我的C ++程序中,我有一个基类B和一些派生类D1,D2等。 然后我有一个函数作为参数派生类D1,由const引用传递以提高性能,而不是通过副本传递它:

void appendDerived(const D1& derived)
{
   listOfDerived.append(D1);
}

listOfDerived 是派生类的列表,因此追加方法如下:

void append(Base* base)
{
    if (!base) return;
    m_myList.append(base->clone()); //clone function is defined for each derived and does: return new D1(*this);
}

由于appendDerived将const引用作为参数,因此编译器在append方法中给出错误,因为 append 没有匹配函数。 我发现的解决方案如下:

  1. 将appendDerived函数更改为:

    void appendDerived(D1 derived)
    {
       listOfDerived.append(&derived);
    }
    

    所以按值传递参数,但性能损失。

  2. 将appendDerived函数更改为:

    void appendDerived(D1* derived)
    {
       listOfDerived.append(derived);
    }
    

    所以通过指针传递参数,这意味着我要在整个代码中将所有函数调用更改为 appendDerived ,但有些缺点我不想在这里列出......

  3. 在追加之前创建一个中间变量:

    void appendDerived(const D1& derived)
    {
       D1 derived_temp = derived;
       listOfDerived.append(&derived_temp);
    }
    

    但似乎是一个太脏的解决方案......

  4. 你有更好的主意吗?

2 个答案:

答案 0 :(得分:5)

  1. 因为您传递的是本地变量的地址而被破坏。
  2. 似乎没问题,但是您更改了函数以获取指针而不是引用。这对来电方有影响。
  3. 以同样的方式被打破1.是。
  4. 因此,您可以使用解决方案2,但您也可以传递非const引用:

    void appendDerived(D1& derived)
    {
       listOfDerived.append(&D1);
    }
    

    要考虑的一些事情:

    • append()接受指针。 appendDerived()是否有意义参考?
    • appendappendDerived中的哪一个需要参数作为const的指针/引用?可能是您在两个地方都需要const,而不是如上所述的非常数。换句话说,将append更改为

    void append(const Base* base)
    {
        if (!base) return;
        m_myList.append(base->clone()); //clone needs to be const, as it should be.
    }
    

    这需要clone()const

    virtual Base* clone() const;
                          ^^^^^
    

答案 1 :(得分:0)

只是为了确保你所制作的清单应该是不变的? 如果你有一个非常数列表,那么尝试使用const引用附加到它是非法的,因为你要破坏const。 你只需要一个引用和一个const引用。