Повторное использование временных в инициализации конструктора - PullRequest
0 голосов
/ 05 ноября 2011

При инициализации членов класса в его конструкторе, как вы можете использовать один и тот же временный объект в нескольких точках?

Пример:

// 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 constructor-call-constructor функция или , добавляющая фиктивный класс, который вызывает A(T1())?


* вроде так:

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

Мотивация: Что, если T1() на самом деле что-то вроде new T(), где адрес объекта имеет значение, так что мне приходится говорить об одном и том же объекте как в t2, так и t3.

Ответы [ 4 ]

4 голосов
/ 05 ноября 2011

Грязный способ повторно использовать временный объект в инициализации конструктора - добавить фиктивный параметр.Я не увлекаюсь этой техникой, но я знаю только одного, чтобы дать временному имя.Я стараюсь перепроектировать свои классы, чтобы избежать этого.

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

    T2 const t2;
    T3 const t3;
};
3 голосов
/ 05 ноября 2011

Const-ссылки могут быть по умолчанию временными, как в последнее время (я забываю, это дополнение C ++ 03 или C ++ 11):

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

(Возможно, объявите этот конструктор explicit, на всякий случай.)

0 голосов
/ 05 ноября 2011

Я бы избежал этой ситуации любой ценой, но если бы у меня было , я бы добавил дополнительного члена:

struct A {
  T1 temp_;
  T2 const t2;
  T3 const t3;
  A() : temp_(), t2(foo(temp_)), t3(bar(temp_)) {}
};
0 голосов
/ 05 ноября 2011

Я бы решил это, создав фабричный метод

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