在构造函数中初始化类的成员时,如何在多个点上使用相同的临时函数?
的例子:
// for arbitrary T1, T2, T3
T2 foo(T1 const&);
T3 bar(T1 const&);
struct A {
T2 const t2;
T3 const t3;
A() : t2(foo(T1())), t3(bar(T1())) {}
};
这是一个非常简单的例子,但是t2
和t3
都是根据T1
的实例构造的。现在,如果我想要那个对象在两次初始化中完全相同,我就有问题了,因为它没有名字。你知道如何解决这个问题,而不需要c++ 11 构造器-调用-构造器特性和添加一个虚拟类调用A(T1())
吗?
*一样:
A(T1 const& t1) : t2(foo(t1)), t3(bar(t1)) {}
动机:如果T1()
实际上类似于new T()
,其中对象的地址很重要,因此我必须在t2
和t3
中谈论相同的对象。
在构造函数初始化中重用临时变量的一种肮脏方法是添加一个虚拟参数。我不喜欢这种技术,但这是我所知道的唯一一种给临时命名的技术。我倾向于重新设计我的类来避免这种情况。
struct A
{
A( T1 temporary_ = T1() )
: t2( foo( temporary_ ) )
, t3( bar( temporary_ ) )
T2 const t2;
T3 const t3;
};
Const-references可以默认为临时的,直到最近(我忘记这是c++ 03还是c++ 11添加的):
A::A(const T & t = T()) : a(t), b(t) { }
// ^^^^^^
(可能声明该构造函数为explicit
,以防万一)
我将通过创建一个工厂方法来解决这个问题
// for arbitrary T1, T2, T3
T2 foo(T1 const&);
T3 bar(T1 const&);
struct A {
T2 const t2;
T3 const t3;
static A createA() { return A(T1()); }
private:
A(const T1& t) : t2(foo(t)), t3(bar(t)) {}
};
我会不惜一切代价避免这种情况,但如果我必须这样做,我会添加一个额外的成员:
struct A {
T1 temp_;
T2 const t2;
T3 const t3;
A() : temp_(), t2(foo(temp_)), t3(bar(temp_)) {}
};