我有这样的事情: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