Проблема в том, что вы стреляете себе в ногу в третьем примере. В C ++ порядок переменных-членов в классе / структуре имеет значение. Независимо от того, как вы решите свою конкретную проблему, если вы передадите неинициализированные данные в конструктор из-за плохого дизайна класса / компоновки членов, вы будете работать с унифицированными данными и, возможно, получите неопределенное поведение, в зависимости от вида используемого кода.
Если обратиться к вашему конкретному примеру, если B
действительно требует A
и отношение один к одному, почему бы не создать новый класс AB
, который имеет как объект A
, так и объект B
в правильном порядке и передайте адрес от A
до B
. То есть:
class AB
{
public:
AB():b_(&a_) {}
private:
A a_;
B b_;
};
теперь класс C
может избежать проблемы с упорядочением, используя AB
вместо A
и B
:
class C
{
public:
...
private:
AB ab_;
};
Как упомянуто выше, это, конечно, предполагает соотношение 1: 1 между A
и B
. Если объект A
может совместно использоваться многими объектами B
, все становится сложнее.