# C++ trên Maguyva: đồ thị lớp và lời gọi cho codebase lớn

Canonical source: https://maguyva.ai/vi/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 hỗ trợ C++ với AST, ký hiệu và đồ thị, để agent AI có thể lần theo lớp, namespace, ghi đè virtual và nơi gọi trong codebase C++ lớn.

## Tổng quan hỗ trợ

- Cấp độ: Hỗ trợ AST và symbol
- Lập trình
- Phần mở rộng: .c, .c++, .cc, .cpp, .cxx, .h, +4 nữa
- Phân tích AST thật cho tìm kiếm nhận biết cú pháp và context cấu trúc.
- Các symbol có tên cung cấp dữ liệu cho tra cứu ngữ nghĩa và tham chiếu chéo. Điều hướng graph khả dụng khi bật trích xuất quan hệ.
- Ngôn ngữ này đóng góp symbol và quan hệ cho tìm kiếm nhận biết graph; các loại edge được hỗ trợ thay đổi theo cấu trúc riêng của ngôn ngữ.
- Cả phân tích AST và trích xuất symbol đều khả dụng.

## Phù hợp nhất

- Game engine, hệ thống giao dịch, trình duyệt và các codebase C++ lớn khác, nơi sửa một header là phải build lại nửa cây mã.
- Hệ phân cấp lớp có phương thức virtual, nơi phương thức thực sự chạy được định nghĩa ở chỗ khác với chỗ nó được gọi.
- Refactor có agent hỗ trợ, cần biết nơi gọi và các ghi đè trước khi đổi chữ ký.

## Workflow agent

- Tìm mọi ghi đè của một phương thức virtual trước khi lớp cơ sở thay đổi.
- Liệt kê nơi gọi một hàm hoặc phương thức lớp có namespace, như `net::Socket::send`, trên toàn codebase.
- Lần theo nơi một lớp được tạo bằng `new` và những thành viên nó chạm vào sau đó.

## Vì sao C++ cần cấu trúc chứ không phải tìm kiếm văn bản

Trong C++, tên không duy nhất. `send` có thể là hàm tự do, thành viên của ba lớp và một bản ghi đè trong lớp thứ tư. Namespace, template và định nghĩa ngoài lớp, như `Socket::send` trong một tệp `.cpp`, chia một kiểu ra nhiều tệp. Tìm kiếm văn bản trả về mọi kết quả khớp, nhưng không cho agent biết lời gọi dẫn tới cái nào.

Maguyva lập chỉ mục lớp, thành viên và lời gọi cùng chủ sở hữu của chúng, để agent lần theo cấu trúc thực trước khi chỉnh sửa.

## Maguyva trích xuất gì từ C++

Maguyva bao phủ các phần mở rộng tệp nguồn và header C++ phổ biến, bao gồm `.cpp`, `.cc`, `.cxx`, `.hpp`, `.hh` và `.hxx`. Lớp, struct và hàm được trích xuất, và một định nghĩa ngoài lớp như `void Socket::send()` được gán cho lớp sở hữu và namespace của nó. Thành viên virtual được ghi lại, và tham số template là một phần của chữ ký.

Việc xác định kiểu receiver theo dõi tham số, khai báo cục bộ, trường, vòng lặp `for` theo phạm vi và `auto`, và nhìn xuyên qua `unique_ptr`, `shared_ptr` và `optional`, để một lời gọi như `conn->send()` được phân giải về đúng lớp. Mệnh đề lớp cơ sở cung cấp dữ liệu cho kế thừa, và biểu thức `new` được tính là khởi tạo.

Việc che macro export và annotation giống như ở C cũng được áp dụng. Khoảng 273 tên thư viện chuẩn (`std::cout`, `std::endl`, `printf` và tương tự) bị lọc khỏi quan hệ. Đồ thị ghi lại lời gọi, include, kế thừa, ghi đè, khởi tạo, tham chiếu kiểu, đọc và ghi, cùng các cạnh `throw`.

## Ví dụ prompt cho agent

- "Những lớp nào ghi đè `Renderer::draw`, và ai gọi nó?" (`dependency_search`)
- "Cho tôi xem `OrderBook::match` và mọi nơi gọi nó." (`find_symbol`)
- "Giải thích cách một thông điệp dữ liệu thị trường tới được engine chiến lược." (`get_task_context`)

## Giới hạn đã biết

- `.h` xuất hiện trong danh sách phần mở rộng của C, C++ và Objective-C, nên trong các cây mã trộn C và C++, header được chia giữa các profile này.
- Thân của macro dạng đối tượng không được phân tích, và lời gọi tới các tên thư viện chuẩn đã bị lọc không phải là cạnh đồ thị. Dùng `text_pattern_search` cho macro và các chỗ dùng `std::`.

## Bước tiếp theo

Kết nối một kho mã bằng [hướng dẫn bắt đầu nhanh](/vi/docs/quickstart), sau đó xem ma trận hỗ trợ trên [trang tương thích](/vi/docs/compatibility). Nếu một phần cây mã là C thuần, hãy đọc thêm [hướng dẫn C](/vi/languages/c).

## Chi tiết engine

- Định nghĩa ngoài lớp như `void Socket::send()` được gán cho lớp sở hữu và namespace của chúng, và thành viên virtual được ghi lại.
- Việc xác định kiểu receiver theo dõi tham số, biến cục bộ, trường, `for` theo phạm vi và `auto`, và nhìn xuyên qua `unique_ptr`, `shared_ptr` và `optional`.
- Mệnh đề lớp cơ sở cung cấp dữ liệu cho kế thừa, biểu thức `new` được tính là khởi tạo, và khoảng 273 tên thư viện chuẩn bị lọc khỏi quan hệ.

## Điểm khởi đầu MCP hữu ích

- `find_symbol`: Dùng với tên định danh đầy đủ như `OrderBook::match` khi bạn cần định nghĩa và nơi gọi.
- `dependency_search`: Trước khi đổi chữ ký, dùng trên một lớp cơ sở hoặc phương thức virtual để tìm các ghi đè và nơi gọi.
- `get_task_context`: Dùng cho các prompt như “giải thích cách một thông điệp dữ liệu thị trường tới được engine chiến lược”.
