# C++ บน Maguyva: กราฟคลาสและการเรียกสำหรับโค้ดเบสขนาดใหญ่

Canonical source: https://maguyva.ai/th/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 สัญลักษณ์ และกราฟ เพื่อให้เอเจนต์ AI ติดตามคลาส namespace การ override แบบเสมือน และผู้เรียกในโค้ดเบส C++ ขนาดใหญ่

## ภาพรวมการรองรับ

- ระดับ: รองรับ AST และสัญลักษณ์
- การเขียนโปรแกรม
- นามสกุลไฟล์: .c, .c++, .cc, .cpp, .cxx, .h, +อีก 4
- การแยกวิเคราะห์ AST จริงสำหรับการค้นหาที่รู้จักไวยากรณ์และบริบทเชิงโครงสร้าง
- สัญลักษณ์ที่มีชื่อป้อนข้อมูลให้การค้นหาเชิงความหมายและการอ้างอิงไขว้ การนำทางกราฟจะใช้งานได้เมื่อเปิดใช้การสกัดความสัมพันธ์
- ภาษานี้ส่งสัญลักษณ์และความสัมพันธ์ไปยังการค้นหาแบบรู้บริบทกราฟ โดยประเภทเอดจ์ที่รองรับจะแตกต่างกันตามโครงสร้างเฉพาะของภาษา
- รองรับทั้งการแยกวิเคราะห์ AST และการสกัดสัญลักษณ์

## เหมาะที่สุดสำหรับ

- เกมเอนจิน ระบบเทรด เบราว์เซอร์ และโค้ดเบส C++ ขนาดใหญ่อื่น ๆ ซึ่งการเปลี่ยนเฮดเดอร์เดียวทำให้ต้อง build ใหม่ครึ่งโครงสร้าง
- ลำดับชั้นคลาสที่มีเมธอดเสมือนซึ่งเมธอดที่ทำงานจริงถูกนิยามไว้คนละที่กับจุดที่ถูกเรียก
- การรีแฟกเตอร์ที่มีเอเจนต์ช่วย ซึ่งต้องรู้ผู้เรียกและการ override ก่อนเปลี่ยนซิกเนเจอร์

## เวิร์กโฟลว์ของเอเจนต์

- หาทุกการ override ของเมธอดเสมือนก่อนเปลี่ยนคลาสฐาน
- แสดงรายการผู้เรียกของฟังก์ชันหรือเมธอดคลาสที่อยู่ใน namespace เช่น `net::Socket::send` ทั่วทั้งโค้ดเบส
- ติดตามว่าคลาสถูกสร้างด้วย `new` ที่ใด และหลังจากนั้นแตะสมาชิกใดบ้าง

## ทำไม C++ ต้องการโครงสร้าง ไม่ใช่การค้นหาข้อความ

ใน C++ ชื่อไม่ได้มีเพียงหนึ่งเดียว `send` อาจเป็นฟังก์ชันอิสระ เป็นสมาชิกของสามคลาส และเป็นการ override ในคลาสที่สี่ namespace, เทมเพลต และนิยามนอกคลาส เช่น `Socket::send` ในไฟล์ `.cpp` แยกชนิดข้อมูลหนึ่งออกไปหลายไฟล์ การค้นหาข้อความคืนทุกผลที่ตรงกัน แต่ไม่ได้บอกเอเจนต์ว่าการเรียกไปจบที่ตัวใด

Maguyva ทำดัชนีคลาส สมาชิก และการเรียกพร้อมเจ้าของ เพื่อให้เอเจนต์ติดตามโครงสร้างจริงก่อนแก้ไข

## Maguyva ดึงอะไรจาก C++ ได้บ้าง

Maguyva ครอบคลุมนามสกุลไฟล์ซอร์สและเฮดเดอร์ของ C++ ที่ใช้กันทั่วไป รวมถึง `.cpp`, `.cc`, `.cxx`, `.hpp`, `.hh` และ `.hxx` คลาส struct และฟังก์ชันถูกดึงออกมา และนิยามนอกคลาสอย่าง `void Socket::send()` จะถูกนับเป็นของคลาสเจ้าของและ namespace สมาชิกเสมือนถูกบันทึกไว้ และพารามิเตอร์เทมเพลตเป็นส่วนหนึ่งของซิกเนเจอร์

การระบุชนิดของรีซีฟเวอร์ติดตามพารามิเตอร์ การประกาศท้องถิ่น ฟิลด์ ลูป `for` แบบเรนจ์ และ `auto` และมองทะลุ `unique_ptr`, `shared_ptr` และ `optional` การเรียกอย่าง `conn->send()` จึงรีโซลฟ์ไปยังคลาสที่ถูกต้อง อนุประโยคคลาสฐานป้อนข้อมูลการสืบทอด และนิพจน์ `new` นับเป็นการสร้างอินสแตนซ์

การปิดบังมาโคร export และแอนโนเทชัน แบบเดียวกับ C ถูกใช้ที่นี่ด้วย ชื่อในไลบรารีมาตรฐานราว 273 ชื่อ (`std::cout`, `std::endl`, `printf` และอื่น ๆ ทำนองเดียวกัน) ถูกกรองออกจากความสัมพันธ์ กราฟบันทึกการเรียก การ include การสืบทอด การ override การสร้างอินสแตนซ์ การอ้างอิงชนิดข้อมูล การอ่านและการเขียน และเส้นเชื่อม `throw`

## ตัวอย่างพรอมต์สำหรับเอเจนต์

- "คลาสใด override `Renderer::draw` และใครเรียกมัน" (`dependency_search`)
- "แสดง `OrderBook::match` และผู้เรียกทั้งหมดให้ดู" (`find_symbol`)
- "อธิบายว่าข้อความข้อมูลตลาดไปถึงเอนจินกลยุทธ์ได้อย่างไร" (`get_task_context`)

## ข้อจำกัดที่ทราบ

- `.h` อยู่ในรายการนามสกุลไฟล์ของ C, C++ และ Objective-C ในโครงสร้างไฟล์ที่ผสม C กับ C++ เฮดเดอร์จึงถูกแบ่งกันระหว่างโปรไฟล์เหล่านี้
- ตัวมาโครแบบออบเจกต์จะไม่ถูกแยกวิเคราะห์ และการเรียกชื่อในไลบรารีมาตรฐานที่ถูกกรองไม่เป็นเส้นเชื่อมในกราฟ ใช้ `text_pattern_search` สำหรับมาโครและการใช้ `std::`

## ขั้นตอนถัดไป

เชื่อมต่อรีโพซิทอรีด้วย[คู่มือเริ่มต้นใช้งาน](/th/docs/quickstart) แล้วดูตารางการรองรับได้ที่[หน้าความเข้ากันได้](/th/docs/compatibility) หากบางส่วนของโครงสร้างเป็น C ล้วน ให้อ่าน[คู่มือภาษา C](/th/languages/c) ด้วย

## รายละเอียดเอนจิน

- นิยามนอกคลาสอย่าง `void Socket::send()` ถูกนับเป็นของคลาสเจ้าของและ namespace และสมาชิกเสมือนถูกบันทึกไว้
- การระบุชนิดของรีซีฟเวอร์ติดตามพารามิเตอร์ ตัวแปรท้องถิ่น ฟิลด์ `for` แบบเรนจ์ และ `auto` และมองทะลุ `unique_ptr`, `shared_ptr` และ `optional`
- อนุประโยคคลาสฐานป้อนข้อมูลการสืบทอด นิพจน์ `new` นับเป็นการสร้างอินสแตนซ์ และชื่อในไลบรารีมาตรฐานราว 273 ชื่อถูกกรองออกจากความสัมพันธ์

## จุดเริ่มต้น MCP ที่มีประโยชน์

- `find_symbol`: ใช้กับชื่อที่ระบุเต็มอย่าง `OrderBook::match` เมื่อต้องการนิยามและผู้เรียก
- `dependency_search`: ก่อนเปลี่ยนซิกเนเจอร์ ใช้บนคลาสฐานหรือเมธอดเสมือน เพื่อหาการ override และผู้เรียก
- `get_task_context`: ใช้กับพรอมต์อย่าง “อธิบายว่าข้อความข้อมูลตลาดไปถึงเอนจินกลยุทธ์ได้อย่างไร”
