Я студент, и недавно появилось задание написать простейший графический редактор по исходникам препода. В принципе, ничего сложного, но вот только дошел до строчки с typedef понеслась) Не очень понятно что делает 7-я строка GItem* (factory)(); в коде:
public:
typedef GItem* (Factory)();
private:
struct Registry
{
char TypeId[20];
GItem* (factory)();
} GTypes[100];
size_t _types;
GFactory();
GFactory(const GFactory&);
GFactory& operator=(const GFactory& other);
public:
void registerType(const char* typeId, Factory factory);
Factory getFactory(const char* typeId) const;
static GFactory& instance() { static GFactory _instance; return _instance; }
Также не вразумлю 17 строку void registerType(const char* typeId, Factory factory);, где та же замена применяется. Помогите разобраться. Очень классно будет, если кто-то сможет расшифровать этот блок без typedef.
В записи typedef GItem* (Factory)(); объявляется алиас с именем Factory для типа функции без аргументов и возвращающей указатель на GItem. Далее, в объявлении функции registerType используется свойство неявного изменения типа аргумента функции с функции на указатель на функцию. Поэтому тип аргумента factory на самом деле Factory *. Без typedef этот кусок выглядел бы вот так:
void registerType(const char* typeId, GItem * ( * factory )(void));
Вместо typedef в современном c++ следует использовать using, кроме того, ситуаций с неявным изменением типа аргумента функции следует категорически избегать и объявить тип аргумента сразу как указатель:
using FactoryFunctionPtr = GItem * ( * )(void);
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости