Что значит typedef Class *(createClassFunction)(void)
(или другой вариант typedef Class* (__stdcall *CreateClassFunction)(void)
) стоять за?
Что это значит? Как мне это объяснить?
Особенно в контексте фабричных шаблонов …
createClassFunction
является typedef для функции, не принимающей аргументов и возвращающей Class *
,
С этим объявлением указатель на такую функцию, очевидно, может действовать как завод для Class
, Использование может быть следующим:
// the class factory
Class * MostTrivialFactoryKnownToMan()
{
return new Class;
}
// another class factory
Class * CreateClassWithLog()
{
ClassWithLog * p = new ClassWithLog; // derived from Class
p->SetLogFile("log.txt");
return p;
}
// code consuming the class factory
void PopulateStars(createClassFunction * factory)
{
// creates many instances of `Class` through `factory`
Sky * sky = GetSky();
for(int i=0; i<sky->GetStarCount(); ++i)
{
Class * inhabitant = (*factory)();
sky->GetStar(i)->SetInhabitant(inhabitant);
}
}
// code deciding which factory to use
const bool todayWeWriteALog = (rand() %2) != 0;
createClassFunction * todaysFactory = todayWeWriteALog ?
&MostTrivialFactoryKnownToMan :
&CreateClassWithLog);
PopulateStars(factory);
__stdcall
специфичный для компилятора атрибут, изменяющий соглашение о вызовах (как параметры и возвращаемое значение передаются между вызывающей стороной и реализацией). Это часто важно для бинарной совместимости — например, когда программе на Паскале нужно вызвать функцию, реализованную на C или C ++.
Вопросы:
Функция фабрики возвращает необработанный указатель. Между фабрикой и потребителем должен быть неявный договор о том, как освободить этот указатель (например, через delete
в или пример).
Использование интеллектуального указателя (например, shared_ptr) для возвращаемого типа позволило бы фабрике определить политику удаления.
Фабрика, как указатель на функцию, может не содержать состояния (например, имя файла журнала, его необходимо жестко закодировать в функции или использовать глобально). вместо этого использование вызываемого объекта позволит реализовать настраиваемые фабрики.