# C++ в Maguyva: графы классов и вызовов для больших кодовых баз

Canonical source: https://maguyva.ai/ru/languages/cpp

License: text under [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/); code samples under [MIT-0](https://opensource.org/license/mit-0); the Maguyva name, logos, brand assets and other code are not covered. Details: [maguyva.ai/license](https://maguyva.ai/license).

Maguyva поддерживает C++ с AST, символами и графом, чтобы ИИ-агенты отслеживали классы, пространства имён, виртуальные переопределения и вызывающих в больших кодовых базах.

## Сводка поддержки

- Уровень: Поддержка AST и символов
- Программирование
- Расширения: .c, .c++, .cc, .cpp, .cxx, .h, +ещё 4
- Настоящий AST-разбор для синтаксически осведомлённого поиска и структурного контекста.
- Именованные символы обеспечивают семантический поиск и перекрёстные ссылки. Навигация по графу доступна, когда включено извлечение связей.
- Этот язык добавляет символы и связи в поиск с учётом графа; поддерживаемые типы рёбер зависят от присущих ему конструкций.
- Доступны и AST-разбор, и извлечение символов.

## Лучше всего подходит

- Игровые движки, торговые системы, браузеры и другие большие кодовые базы на C++, где правка одного заголовка пересобирает полдерева.
- Иерархии классов с виртуальными методами, где выполняемый метод определён не там, где его вызывают.
- Рефакторинг с участием агентов, которому перед изменением сигнатуры нужны вызывающие и переопределения.

## Сценарии работы агента

- Найти все переопределения виртуального метода, прежде чем менять базовый класс.
- Перечислить по всей кодовой базе вызывающих функцию или метод класса из пространства имён, например `net::Socket::send`.
- Проследить, где класс создаётся через `new` и какие члены он затрагивает дальше.

## Почему C++ нужна структура, а не текстовый поиск

В C++ имена не уникальны. `send` может быть свободной функцией, членом трёх классов и переопределением в четвёртом. Пространства имён, шаблоны и определения вне класса, например `Socket::send` в файле `.cpp`, распределяют один тип по многим файлам. Текстовый поиск возвращает все совпадения, но не говорит агенту, до какого из них доходит вызов.

Maguyva индексирует классы, члены и вызовы вместе с их владельцами, чтобы агент шёл по реальной структуре, прежде чем вносить правки.

## Что Maguyva извлекает из C++

Maguyva охватывает распространённые расширения исходных и заголовочных файлов C++, включая `.cpp`, `.cc`, `.cxx`, `.hpp`, `.hh` и `.hxx`. Извлекаются классы, структуры и функции, а определение вне класса, например `void Socket::send()`, относится к классу-владельцу и пространству имён. Виртуальные члены фиксируются, а параметры шаблонов входят в сигнатуры.

Типизация получателей отслеживает параметры, локальные объявления, поля, циклы `for` по диапазону и `auto`, а также заглядывает внутрь `unique_ptr`, `shared_ptr` и `optional`, поэтому вызов вроде `conn->send()` можно разрешить в нужный класс. Списки базовых классов питают наследование, а выражения `new` считаются созданием экземпляров.

Действует то же маскирование макросов экспорта и аннотаций, что и в C. Около 273 имён стандартной библиотеки (`std::cout`, `std::endl`, `printf` и подобные) отфильтровываются из связей. Граф фиксирует вызовы, include, наследование, переопределения, создание экземпляров, ссылки на типы, чтения и записи, а также рёбра `throw`.

## Примеры промптов для агентов

- «Какие классы переопределяют `Renderer::draw` и кто его вызывает?» (`dependency_search`)
- «Покажи `OrderBook::match` и всех вызывающих.» (`find_symbol`)
- «Объясни, как сообщение с рыночными данными доходит до движка стратегий.» (`get_task_context`)

## Известные ограничения

- `.h` входит в списки расширений C, C++ и Objective-C, поэтому в деревьях, где смешаны C и C++, заголовки общие для этих профилей.
- Тела объектных макросов не разбираются, а вызовы отфильтрованных имён стандартной библиотеки не становятся рёбрами графа. Для макросов и использования `std::` применяйте `text_pattern_search`.

## Следующие шаги

Подключите репозиторий по [быстрому старту](/ru/docs/quickstart), затем изучите матрицу поддержки на [странице совместимости](/ru/docs/compatibility). Если часть дерева написана на чистом C, прочитайте и [руководство по C](/ru/languages/c).

## Детали движка

- Определения вне класса, например `void Socket::send()`, относятся к классу-владельцу и пространству имён, а виртуальные члены фиксируются.
- Типизация получателей отслеживает параметры, локальные переменные, поля, `for` по диапазону и `auto` и заглядывает внутрь `unique_ptr`, `shared_ptr` и `optional`.
- Списки базовых классов питают наследование, выражения `new` считаются созданием экземпляров, а около 273 имён стандартной библиотеки отфильтровываются из связей.

## Полезные точки входа MCP

- `find_symbol`: Используйте с квалифицированным именем вроде `OrderBook::match`, когда нужны определение и вызывающие.
- `dependency_search`: Перед изменением сигнатуры используйте для базового класса или виртуального метода, чтобы найти переопределения и вызывающих.
- `get_task_context`: Используйте для промптов вроде «объясни, как сообщение с рыночными данными доходит до движка стратегий».
