ПрограммированиеФорумОбщее

c++, инициализация, ссылки

#0
22:41, 6 апр 2017
class A
{
public:
  A(class B &b);
  A &a;
};

class B
{
public:
  B()
    : a(*this)
  {}
  A &get_a()
  {
    return a;
  }
  A a;
};

A::A(B &b)
    : a(b.get_a())
  {}

int main()
{
  B b;
  A a(b);
  return 0;
}


Конкретно такой код будет работать?
Тут есть ub или нет?

+ Показать
#1
23:00, 6 апр 2017

Не скомпилируется.
Но можно переписать так, чтобы скомпилировался и работал. Через inline описания методов вне класса.

#2
23:17, 6 апр 2017

Окей, переписал что б компилилось. Не суть важна.
Вопрос в том корректно ли всегда будет работать данный код.

#3
0:31, 7 апр 2017

если класс B будет иметь наследников с виртуальными методами и ты в методе A::A(B &b) будешь этими методами пользоваться то работать не будет, т.к. ты передаешь в функцию ссылку на не до конца сконструированный объект. В текущем же виде код работать будет без проблем.

ПрограммированиеФорумОбщее

Тема в архиве.