在构造函数初始化中重用临时值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在构造函数初始化中重用临时值相关的知识,希望对你有一定的参考价值。
在构造函数中初始化类的成员时,如何在多个点上使用相同的临时值?
例:
// 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引用可能默认为临时引用(我忘记这是否是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_)) {}
};
以上是关于在构造函数初始化中重用临时值的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin类的初始化 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )
Kotlin类与对象 ② ( 主构造函数 | 主构造函数定义临时变量 | 主构造函数中定义成员属性 | 次构造函数 | 构造函数默认参数 )