在构造函数初始化中重用临时函数
Reuse of temporary in constructor initialisations
在构造函数中初始化类的成员时,如何在多个点上使用相同的临时函数?
的例子:
// 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_)) {}
};
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- makefile对我的名称空间对象/函数/构造函数的不确定引用
- 没有可调用的匹配函数(构造函数),候选函数不同于对给定类型的引用
- C++库制作,隐藏在标头中没有友元的析构函数/构造函数
- 从另一个成员函数/构造函数调用C++构造函数是否执行初始值设定项列表
- 在另一个函数/构造函数 [C++] 中初始化后使变量只读
- std::调用函数时找不到函数构造函数
- 显式调用基类析构函数/构造函数合法吗
- 函数构造函数和nullptr
- 用委托构造函数构造函数
- 虚函数构造函数和调用虚函数时会发生什么
- 一些Qt函数/构造函数参数的内存管理
- 使用for_each或std::transform时,c++函函数构造函数是如何被调用的?
- std函数构造函数初始化