在构造函数初始化中重用临时值

问题描述 投票:0回答:4

在构造函数中初始化类的成员时,如何在多个点上使用相同的临时值?

例:

// 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())) {}
};

这是一个非常简化的例子,但t2t3都是根据T1的实例构建的。现在,如果我希望该对象在两个初始化中完全相同*我有一个问题,因为它没有名称。你有没有想法如何在没有C ++ 11构造函数调用构造函数的情况下解决这个问题,也没有添加一个调用A(T1())的虚拟类?


*像这样:

  A(T1 const& t1) : t2(foo(t1)), t3(bar(t1)) {}

动机:如果T1()实际上像new T(),对象的地址很重要,那么我必须在t2t3中讨论相同的对象。

c++ constructor temporary
4个回答
4
投票

在构造函数初始化中重用临时的脏方法是添加伪参数。我并不热衷于这种技术,但是我知道的唯一一个给临时名字的人。我倾向于重新设计我的课程以避免这种情况。

struct A
{
    A( T1 temporary_ = T1() )
      : t2( foo( temporary_ ) )
      , t3( bar( temporary_ ) )

    T2 const t2;
    T3 const t3;
};

3
投票

从最近开始,Const引用可能默认为临时引用(我忘记这是否是C ++ 03或C ++ 11的补充):

A::A(const T & t = T()) : a(t), b(t) { }
//              ^^^^^^

(也许可以声明构造函数explicit,以防万一。)


0
投票

我会通过创建工厂方法来解决这个问题

// 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)) {}
};

0
投票

我会不惜一切代价避免这种情况,但如果必须,我会增加一个额外的成员:

struct A {
  T1 temp_;
  T2 const t2;
  T3 const t3;
  A() : temp_(), t2(foo(temp_)), t3(bar(temp_)) {}
};
© www.soinside.com 2019 - 2024. All rights reserved.