В «Современном дизайне C ++» почему PrototypeFactoryUnit :: GetPrototype должен вызывать DoGetPrototype? - PullRequest
1 голос
/ 02 апреля 2012

В книге Андрея Александреску "Современный дизайн C ++", почему PrototypeFactoryUnit::GetPrototype должен вызывать функцию друга DoGetPrototype?Почему он не может просто установить переданный указатель на сам прототип?То же самое было сделано с функциями PrototypeFactoryUnit::SetPrototype и DoSetPrototype.

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

Некоторый контекст!

template <class, class Base>
class PrototypeFactoryUnit: public Base {
public:
  typedef typename Base::ProductList::Head AbstractProduct;

  friend void DoGetPrototype(const PrototypeFactoryUnit& me,
                             AbstractProduct*& pPrototype)
  {
    pPrototype = me.pPrototype_;
  }

  template <class U>
  void GetPrototype(U*& p) {
    return DoGetPrototype(*this, p);
  }
private:
  AbstractProduct* pPrototype_;
};

(хотя это и дало мне возможность убрать пыль на этом ...)

Поскольку GetPrototype - это шаблон, он можетбыть воплощенным во многих различных типах.Затем в игру вступит разрешение перегрузки!

Например, я пишу DoGetPrototype(...& me, DerivedProduct*& p) и затем говорю:

DerivedProduct* p =0;
factory.GetPrototype(p);

Затем вызывается перегрузка my .

Следовательно, это точка настройки: статическая отправка, аналогичная аналогу времени выполнения функции virtual с реализацией по умолчанию.

0 голосов
/ 01 июля 2017

Если напишешь просто

void GetPrototype(AbstractProduct*& p)
    { p = pPrototype_; }

где AbstractProduct - это параметр шаблона PrototypeFactoryUnit, тогда будет виден только GetPrototype, специализированный с последним типом ConcreteFactory * TList.

Это потому, что ConcreteFactory линейно наследует специализации PrototypeFactoryUnit для каждого типа TList, а все предыдущие версии GetPrototype будут скрыты по имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...