我有這樣的事情:C++:引用和工廠
struct D {
virtual void operator() {...};
}
struct D1 : public D {
virtual void operator() {...};
}
struct D2 : public D {
virtual void operator() {...};
}
void foo(D &d) {...};
所以這是好的,並很好地控制了我的D的生命週期:
foo(D());
foo(D1());
foo(D2());
但我選擇我的d變種在多個地方,所以我想要一個簡單的工廠:
const D& make_D()
{
// BAD, returning reference to temporary
if(is_tuesday())
return D1();
return D2();
}
而是參考返回到一個臨時的,我可以返回一個OBJE ct,但隨後我切片到基類。或者,我可以從我的工廠返回一個指針,但客戶端必須刪除它。其他更復雜的解決方案也會給客戶帶來更多負擔。
有寫類似
D& d = make_D();
foo(d);
(甚至foo(make_D())
)的方法嗎?我們的目標是將各種D定義和make_D()
中的複雜性都包含進來,以便諸如foo()
之類的函數和那些調用這些函數的函數不必擔心。
注意:'foo(D())'不會被編譯(不在符合的編譯器下,甚至VS會發出關於非標準行爲的警告),因爲臨時的不能綁定到非const的l值引用。 – 2012-04-03 10:20:47