从常量对象引用到指针

ABC*_*lus 1 c++

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

void appendDerived(const D1& derived)
{
   listOfDerived.append(D1);
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

由于appendDerived取作为参数常量引用,编译器为在append方法错误,因为有一个为不匹配的函数追加.我发现的解决方案如下:

  1. 将appendDerived函数更改为:

    void appendDerived(D1 derived)
    {
       listOfDerived.append(&derived);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    所以通过值传递参数,但性能损失.

  2. 将appendDerived函数更改为:

    void appendDerived(D1* derived)
    {
       listOfDerived.append(derived);
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    void appendDerived(const D1& derived)
    {
       D1 derived_temp = derived;
       listOfDerived.append(&derived_temp);
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

你有更好的主意吗?

jua*_*nza 5

  1. 因为你传递了一个局部变量的地址而被打破了.
  2. 似乎没问题,但你改变了函数来获取指针而不是引用.这对呼叫方有影响.
  3. 以同样的方式被打破1.是.

因此,您可以使用解决方案2,但您也可以传递非const引用:

void appendDerived(D1& derived)
{
   listOfDerived.append(&D1);
}
Run Code Online (Sandbox Code Playgroud)

一些要考虑的事情:

  • 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.
}
Run Code Online (Sandbox Code Playgroud)

这需要clone()const:

virtual Base* clone() const;
                      ^^^^^
Run Code Online (Sandbox Code Playgroud)