Циклическая ссылка в C++ без указателей

Выполненный traceroute. Буквально каждый интерфейс или маршрутизатор между Вами и местом назначения могут получить Ваши пакеты.

Запуск с Вашего собственного компьютера, выполняющего анализатор пакетов без Вашего ведома, возможно, в результате заражения.

5
задан Michel 26 August 2009 в 13:03
поделиться

4 ответа

Вместо этого можно использовать ссылки

struct A;
struct B {
  A& a;
};

struct A {
  B b;
};

Но нет возможности создать циклическую ссылку без некоторого уровня косвенности. Ваш образец даже не создает циклическую ссылку, а пытается создать рекурсивное определение. Результатом будет структура бесконечного размера и, следовательно, незаконная.

13
ответ дан 18 December 2019 в 05:26
поделиться

How could this work? If I remember correctly, the address value of a reference can't be modified once set, so you can't define a circular reference.

It could work like the following (same as Jared's example plus constructors defined):

struct A;

struct B {
  A& m_a;
  B(A& a) : m_a(a) {}
};

struct A {
  B m_b;
  //construct B m_b member using a reference to self
  A() : m_b(*this) {}
  //construct B m_b member using a reference to other
  A(A& other) : m_b(other) {}
};
7
ответ дан 18 December 2019 в 05:26
поделиться

Нет, нет. Такая структура будет иметь бесконечный размер.

Вы можете использовать интеллектуальные указатели ( shared_ptr и weak_ptr ), чтобы избежать прямого манипулирования указателями,

15
ответ дан 18 December 2019 в 05:26
поделиться

Они также возникают время от времени, когда я кодирую. Вы можете переместить второй оператор using в другую функцию?

struct A;
struct B {
    A* a;
    B(A*);
};

struct A {
    B* b;
    A(B* b_) : b(b_)  { if(b) b.a = this; }
};

B::B(A* a_) : : a(a_) { if(a) a.b = this; }

Я не думаю, что это можно сделать с помощью ссылок.

1
ответ дан 18 December 2019 в 05:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: