Я ищу хороший шаблон для реализации следующего:
class Outer;
class Inner
{
Outer * m_outer;
public:
InitOuter(Outer * o) { m_outer = o; }
}
class Outer
{
Inner m_inner;
public:
Outer()
{
m_inner.InitOuter(outer);
}
}
- Внутренний всегда должен быть создан со ссылкой на внешний
- m_outer никогда не будет NULL
- m_outer не изменится в течение жизни
Inner
К сожалению, как я понимаю, m_outer
не может быть ни ссылкой, ни неизменным указателем, так как следующая инициализациянедопустимо:
Inner::Inner(Outer & o) : m_outer(o) {}
Outer::Outer() : m_inner(*this) {}
, поскольку при инициализации m_inner
, Outer
не полностью сконструирован и, следовательно, this
является недействительным (и может также измениться при дальнейшей инициализации).
Единственная альтернатива, которую я нашел, состояла в том, чтобы сделать конструктор Inner
закрытым, а Outer
другом Inner
.Это немного лучше, но отношения «друг» кажутся сколь угодно сильными (поскольку обычно внутренний класс должен инкапсулировать функциональность).
Как вы реализуете это?
Мотивация: По моемупонимание C ++, «Outer» еще не полностью построено, поэтому доступ к this
может юридически вызвать неопределенное поведение (кто-нибудь может подтвердить это - или даже лучше, что это не так?).
И нет, мне здесь не нужна инверсия контроля.Действительно, спасибо, но нет.
Я пропустил такие детали, как скрытие копии CTor + присвоение.