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のconstructor-calls-constructor機能を使用せずに、または呼び出すダミークラスを追加せずに、これを解決する方法を知っています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

最近の時点で、Const-referencesはデフォルトで一時的なものになっている可能性があります(これが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 に答える