Один очевидный способ - использовать new / delete и B *, но мне интересно
это возможно без использования динамической памяти?
Обычно вы либо используете указатель, либо добавляете один конструктор в класс B, чтобы он мог передать аргумент для инициализации объекта A, как уже упоминалось во многих ответах.
Но в некоторых особых случаях вы могли бы уйти без добавления конструктора в класс B и без указателя, но с помощью инициализации значения , когда класс B не определяет конструктор:
struct B{
int i;
};
struct A{
B b;
};
int main()
{
A a ={1}; //here i being initialized to 1
}
Обратите внимание, что я не рекомендую эту инициализацию значения, просто чтобы вы знали, что объект может быть инициализирован таким образом.