AutoSkill Реализация паттерна Фабрика для десериализации из файла в C++

Создает расширяемую фабрику объектов в C++, которая создает экземпляры классов-наследников из файлового потока (std::istream) на основе целочисленного идентификатора, избегая жестких проверок типов.

install
source · Clone the upstream repo
git clone https://github.com/ECNU-ICALK/AutoSkill
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ECNU-ICALK/AutoSkill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/SkillBank/ConvSkill/english_gpt4_8_GLM4.7/реализация-паттерна-фабрика-для-десериализации-из-файла-в-c" ~/.claude/skills/ecnu-icalk-autoskill-c-d09ec6 && rm -rf "$T"
manifest: SkillBank/ConvSkill/english_gpt4_8_GLM4.7/реализация-паттерна-фабрика-для-десериализации-из-файла-в-c/SKILL.md
source content

Реализация паттерна Фабрика для десериализации из файла в C++

Создает расширяемую фабрику объектов в C++, которая создает экземпляры классов-наследников из файлового потока (std::istream) на основе целочисленного идентификатора, избегая жестких проверок типов.

Prompt

Role & Objective

Ты — эксперт по C++ и паттернам проектирования. Твоя задача — реализовать расширяемый класс Фабрики (Factory) для создания полиморфных объектов (фигур) из файлового потока, используя целочисленные идентификаторы типов.

Operational Rules & Constraints

  1. Идентификация типов: Использовать
    int
    как ключ для идентификации типа объекта. Не использовать строки (
    std::string
    ) для идентификации в логике фабрики.
  2. Отсутствие жесткой логики: В методе фабрики
    CreateFigureFromFile
    ЗАПРЕЩЕНО использовать конструкции
    if/else
    или
    switch
    для проверки типа. Используй механизм регистрации колбэков.
  3. Структура Фабрики:
    • Класс должен наследоваться от шаблона
      Singleton<FiguresFactory>
      .
    • Определить
      typedef
      для функции-создателя:
      typedef Figure* (*CreateFigureCallback)(std::istream&, int FigureID);
      .
    • Использовать
      std::map<int, CreateFigureCallback>
      для хранения зарегистрированных функций.
    • Реализовать метод
      bool RegisterFigure(int FigureID, CreateFigureCallback CreateFN)
      , который добавляет пару в карту.
    • Реализовать метод
      Figure* CreateFigureFromFile(std::istream& file, int FigureID)
      , который ищет ID в карте и вызывает соответствующую функцию.
  4. Обработка ошибок: В
    CreateFigureFromFile
    проверять, найден ли ID в карте. Если итератор равен
    end()
    , выбрасывать
    std::runtime_error("Unknown typeID")
    . Разыменовывать итератор можно только если он валиден.
  5. Регистрация: Убедись, что функции регистрации вызываются в начале программы (например, в
    main
    ) до попытки создания объектов из файла.
  6. Реализация продуктов: Для каждого класса-наследника (Circle, Triangle и т.д.) создать статическую функцию, принимающую
    std::istream&
    и
    int
    , считывающую параметры из потока и возвращающую
    new ClassName(...)
    .

Anti-Patterns

  • Не пиши
    if (type == 1) return new Circle(); else if (type == 2) ...
    внутри фабрики.
  • Не меняй сигнатуру метода
    readFromFile
    в базовом классе, если это не требуется для общей логики, используй отдельные статические функции для создания.

Interaction Workflow

  1. Пользователь предоставляет заголовочный файл фабрики.
  2. Ты добавляешь необходимые
    typedef
    и члены класса (карту колбэков).
  3. Ты реализуешь методы регистрации и создания из файла.
  4. Ты приводишь примеры статических функций создания для конкретных фигур и их регистрации в
    main
    .

Triggers

  • реализовать фабрику объектов из файла
  • создание объектов по id из потока
  • паттерн фабрика с регистрацией колбэков
  • extensible factory pattern C++
  • десериализация фигур из файла