Круговые зависимости между классами не всегда являются проблемой и часто неизбежны. Проблема, о которой говорит блог, заключается в том, что ПОСЛЕ применения внедрения зависимости становится невозможным построить A & B (потому что A нужен B, а B нужен A, оба для построения). Это особый вид круговой зависимости.
Если A или B имеют смысл без другого, тогда проблема устранена: тот класс, который НЕ НУЖЕН другому, может быть создан без него.
Например, допустим, что A - это своего рода диспетчер, который отправляет сообщения в произвольный набор объектов B:
struct A
{
A() {}
void add_b(B const& b) { bs.push_back(b); }
void dispatch(int num) { std::for_each(bs.begin(), bs.end(), [num](B & b) { b.message(num); }); }
void something_b_uses();
};
struct B
{
B(A* a) : my_a(a) {}
...
void message(int num) { a->something_b_uses(); }
};
Есть круговая зависимость, у которой нет проблемы.