Непонятное применение typedef

179
01 июня 2018, 00:40

Я студент, и недавно появилось задание написать простейший графический редактор по исходникам препода. В принципе, ничего сложного, но вот только дошел до строчки с 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.

Answer 1

В записи typedef GItem* (Factory)(); объявляется алиас с именем Factory для типа функции без аргументов и возвращающей указатель на GItem. Далее, в объявлении функции registerType используется свойство неявного изменения типа аргумента функции с функции на указатель на функцию. Поэтому тип аргумента factory на самом деле Factory *. Без typedef этот кусок выглядел бы вот так:

void registerType(const char* typeId, GItem * ( * factory )(void));

Вместо typedef в современном c++ следует использовать using, кроме того, ситуаций с неявным изменением типа аргумента функции следует категорически избегать и объявить тип аргумента сразу как указатель:

using FactoryFunctionPtr = GItem * ( * )(void);
READ ALSO
Инициализация указателя

Инициализация указателя

Объясните пожалуйста новичку: Часто видел в коде профессионалов и толковых программистов как они объявляли указатель в классе, но инициализировали...

194
Перевод из float в *char [закрыт]

Перевод из float в *char [закрыт]

Как перевести из float в *char? Смотрите,мне нужно перевести из float в *char, и записать его в char vectorВектором пользоваться умею ,но не знаю как перевести...

213
Как подключить шифрование?

Как подключить шифрование?

Есть программа на шарпах:

185