在我的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方法错误,因为有一个为不匹配的函数追加.我发现的解决方案如下:
将appendDerived函数更改为:
void appendDerived(D1 derived)
{
listOfDerived.append(&derived);
}
Run Code Online (Sandbox Code Playgroud)
所以通过值传递参数,但性能损失.
将appendDerived函数更改为:
void appendDerived(D1* derived)
{
listOfDerived.append(derived);
}
Run Code Online (Sandbox Code Playgroud)
所以通过指针传递参数,这意味着我要在整个代码中将所有函数调用更改为appendDerived,但有些缺点我不想在此处列出...
在追加之前创建一个中间变量:
void appendDerived(const D1& derived)
{
D1 derived_temp = derived;
listOfDerived.append(&derived_temp);
}
Run Code Online (Sandbox Code Playgroud)
但似乎是一个太脏的解决方案......
你有更好的主意吗?
因此,您可以使用解决方案2,但您也可以传递非const引用:
void appendDerived(D1& derived)
{
listOfDerived.append(&D1);
}
Run Code Online (Sandbox Code Playgroud)
一些要考虑的事情:
append()拿一个指针.参考是否有意义appendDerived()?append或appendDerived需要参数指针/引用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)