Я студент, и недавно появилось задание написать простейший графический редактор по исходникам препода. В принципе, ничего сложного, но вот только дошел до строчки с 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);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Объясните пожалуйста новичку: Часто видел в коде профессионалов и толковых программистов как они объявляли указатель в классе, но инициализировали...
Как перевести из float в *char? Смотрите,мне нужно перевести из float в *char, и записать его в char vectorВектором пользоваться умею ,но не знаю как перевести...