从常量对象引用到指针

From constant object reference to pointer

本文关键字:指针 对象引用 常量      更新时间:2023-10-16

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

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

listOfDerived是一个派生类的列表,所以append方法如下:

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);
    }
    
你有更好的主意吗?
  1. 是坏的,因为你正在传递一个局部变量的地址。
  2. 似乎没问题,但您将函数更改为接受指针而不是引用。这对调用方有影响。
  3. 以同样的方式被破坏。是多少。
因此,您可以使用解决方案2,但您也可以传递一个非const引用:
void appendDerived(D1& derived)
{
   listOfDerived.append(&D1);
}

要考虑的几件事:

  • append()接受一个指针。appendDerived()取一个参考值有意义吗?
  • appendappendDerived中哪一个需要参数为指向const的指针/引用?这可能是您在两个地方都需要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;
                      ^^^^^

只是为了确保你所做的列表应该是恒定的还是不恒定的?如果你有一个非常量列表,那么尝试使用const引用来追加它是非法的,因为你会破坏const。您只需要接受一个引用和一个const引用。