Взаимная дружба и указатели: какой шаблон или анти-шаблон?

При изучении источника массивного приложения С++ я нахожу этот шаблон (синтаксис для примера может быть отрывочным, но здесь есть существенные детали):

class A : X
 friend B;
 B *parent;
 ...stuff...
class B : Y
 friend A;
 A *myhelper;
 ...stuff...

Возможно, имеет смысл, что класс B на самом деле называется AHelper, но мне больше любопытно об этом довольно симметричном отношении между двумя классами. Является ли эта часть одного из стандартных шаблонов GoF или установленным анти-шаблоном? Есть ли какая-то концепция или способ понимания этого, кроме деталей, целого, большего, чем части?

Было бы целесообразно объединить A и B в один класс? Существует вопрос о том, что каждый класс унаследован от других классов X, Y. Я очень хочу реорганизовать этот код, чтобы сделать его более удобным и удобным.

2 ответа

Зависит от того, что делают классы. Если он похож на шаблон итератора (т.е. std::vector и std::vector<t>::iterator</t>), то он может быть использован для чего-то хорошего.

С другой стороны, если классы выполняют принципиально разные вещи, вероятно, лучше всего, если они будут открыты только друг другу, используя их общедоступные интерфейсы.

Другими словами, я не думаю, что это шаблон или анти-шаблон - он полностью зависит от использования реальных классов.


A и B плотно связаны, но их времена жизни могут быть разными. Возможно, стоит сделать один класс, если:

  • A и B имеют одинаковое время жизни, поэтому всегда существует вместе с другим.
  • Всегда существует один экземпляр A для каждого экземпляра B и наоборот.

Однако, возможно, это не так.

Учитывая, что A происходит от X и B, происходит от Y, когда у меня есть совместно связанные классы, это обычно базовые классы, которые связаны, и каждый класс не взаимодействует с фактическим конкретным классом другого.

В этих случаях это было не одно отношение времени жизни, на самом деле у меня есть один главный объект, который создает и загружает объекты меньшего размера, которые возвращаются к мастеру для получения дополнительной информации.

Я не знаю, имеет ли шаблон имя. Я никогда не был горячим по именам шаблонов дизайна.

licensed under cc by-sa 3.0 with attribution.