0

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

例子:

// 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

4

4 回答 4

4

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

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

    T2 const t2;
    T3 const t3;
};
于 2011-11-04T22:37:30.017 回答
3

最近,常量引用可能默认为临时的(我忘记了这是 C++03 还是 C++11 的添加):

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

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

于 2011-11-04T22:42:50.903 回答
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)) {}
};
于 2011-11-04T22:37:50.903 回答
0

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

struct A {
  T1 temp_;
  T2 const t2;
  T3 const t3;
  A() : temp_(), t2(foo(temp_)), t3(bar(temp_)) {}
};
于 2011-11-04T22:50:24.990 回答