Фабричный шаблон: typedef Class * (createClassFunction) (void)

Что значит typedef Class *(createClassFunction)(void) (или другой вариант typedef Class* (__stdcall *CreateClassFunction)(void)) стоять за?
Что это значит? Как мне это объяснить?
Особенно в контексте фабричных шаблонов …

0

Решение

Чтение выражений типа C

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) для возвращаемого типа позволило бы фабрике определить политику удаления.

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

1

Другие решения


По вопросам рекламы [email protected]