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