# C++-tuki Maguyva-palvelussa: luokka- ja kutsugraafit suurille koodikannoille

Canonical source: https://maguyva.ai/fi/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 tukee C++:aa AST-jäsennyksellä, symboleilla ja graafilla, jotta tekoälyagentit voivat seurata luokkia, nimiavaruuksia, virtuaalisia ylikirjoituksia ja kutsujia suurissa C++-koodikannoissa.

## Tukikatsaus

- Taso: AST- ja symbolituki
- Ohjelmointi
- Päätteet: .c, .c++, .cc, .cpp, .cxx, .h, +4 lisää
- Oikea AST-jäsennys syntaksitietoiseen hakuun ja rakenteelliseen kontekstiin.
- Nimetyt symbolit syöttävät semanttista hakua ja ristiviittauksia. Graafinavigointi on käytettävissä, kun suhteiden poiminta on käytössä.
- Tämä kieli tuo symboleja ja suhteita graafia hyödyntävään hakuun; tuetut reunatyypit vaihtelevat kielen omien rakenteiden mukaan.
- Sekä AST-jäsennys että symbolien poiminta ovat käytettävissä.

## Parhaiten sopii

- Pelimoottorit, kaupankäyntijärjestelmät, selaimet ja muut suuret C++-koodikannat, joissa yhden otsakkeen muutos kääntää puolet puusta uudelleen.
- Virtuaalisia metodeja sisältävät luokkahierarkiat, joissa suoritettava metodi on määritelty muualla kuin missä sitä kutsutaan.
- Agenttiavusteinen refaktorointi, joka tarvitsee kutsujat ja ylikirjoitukset ennen allekirjoituksen muutosta.

## Agenttien työnkulut

- Löytää virtuaalisen metodin kaikki ylikirjoitukset ennen kuin kantaluokkaa muutetaan.
- Listata koko koodikannasta nimiavaruuteen kuuluvan funktion tai luokan metodin kutsujat, esimerkiksi `net::Socket::send`.
- Jäljittää, missä luokka luodaan `new`-lausekkeella ja mihin jäseniin se koskee seuraavaksi.

## Miksi C++ tarvitsee rakennetta eikä tekstihakua

C++:ssa nimet eivät ole yksilöllisiä. `send` voi olla vapaa funktio, kolmen luokan jäsen ja ylikirjoitus neljännessä. Nimiavaruudet, mallipohjat ja luokan ulkopuoliset määrittelyt, kuten `Socket::send` tiedostossa `.cpp`, levittävät yhden tyypin moneen tiedostoon. Tekstihaku palauttaa jokaisen osuman mutta ei kerro agentille, mihin niistä kutsu päätyy.

Maguyva indeksoi luokat, jäsenet ja kutsut omistajineen, jotta agentti voi seurata todellista rakennetta ennen muokkaamista.

## Mitä Maguyva poimii C++:sta

Maguyva kattaa yleiset C++:n lähde- ja otsaketiedostojen päätteet, muun muassa `.cpp`, `.cc`, `.cxx`, `.hpp`, `.hh` ja `.hxx`. Luokat, rakenteet ja funktiot poimitaan, ja luokan ulkopuolinen määrittely kuten `void Socket::send()` kohdistetaan omistavaan luokkaan ja nimiavaruuteen. Virtuaaliset jäsenet tallennetaan, ja mallipohjien parametrit kuuluvat allekirjoituksiin.

Vastaanottajan tyypitys seuraa parametreja, paikallisia esittelyjä, kenttiä, aluepohjaisia `for`-silmukoita ja `auto`-avainsanaa ja katsoo tyyppien `unique_ptr`, `shared_ptr` ja `optional` läpi, joten kutsun kuten `conn->send()` voi ratkaista oikeaan luokkaan. Kantaluokkalausekkeet syöttävät periytymisen, ja `new`-lausekkeet lasketaan ilmentymän luonniksi.

Samaa vienti- ja annotaatiomakrojen peittämistä sovelletaan kuin C:ssä. Noin 273 standardikirjaston nimeä (`std::cout`, `std::endl`, `printf` ja vastaavat) suodatetaan pois suhteista. Graafi tallentaa kutsut, include-lauseet, periytymisen, ylikirjoitukset, ilmentymien luonnin, tyyppiviittaukset, luvut ja kirjoitukset sekä `throw`-kaaret.

## Esimerkkikehotteita agenteille

- "Mitkä luokat ylikirjoittavat metodin `Renderer::draw`, ja kuka sitä kutsuu?" (`dependency_search`)
- "Näytä `OrderBook::match` ja kaikki sen kutsujat." (`find_symbol`)
- "Selitä, miten markkinadataviesti päätyy strategiamoottoriin." (`get_task_context`)

## Tunnetut rajoitukset

- `.h` on C:n, C++:n ja Objective-C:n tiedostopäätteiden luetteloissa, joten C:tä ja C++:aa sekoittavissa puissa otsakkeet jaetaan näiden profiilien kesken.
- Oliomaisten makrojen runkoja ei jäsennetä, eivätkä suodatettujen standardikirjaston nimien kutsut ole graafin kaaria. Käytä makroille ja `std::`-käytöille työkalua `text_pattern_search`.

## Seuraavat vaiheet

Yhdistä repositorio [pikaoppaan](/fi/docs/quickstart) avulla ja tarkista sitten tukimatriisi [yhteensopivuussivulta](/fi/docs/compatibility). Jos osa puusta on puhdasta C:tä, lue myös [C-opas](/fi/languages/c).

## Moottorin yksityiskohdat

- Luokan ulkopuoliset määrittelyt kuten `void Socket::send()` kohdistetaan omistavaan luokkaan ja nimiavaruuteen, ja virtuaaliset jäsenet tallennetaan.
- Vastaanottajan tyypitys seuraa parametreja, paikallisia muuttujia, kenttiä, aluepohjaista `for`-silmukkaa ja `auto`-avainsanaa ja katsoo tyyppien `unique_ptr`, `shared_ptr` ja `optional` läpi.
- Kantaluokkalausekkeet syöttävät periytymisen, `new`-lausekkeet lasketaan ilmentymän luonniksi, ja noin 273 standardikirjaston nimeä suodatetaan pois suhteista.

## Hyödylliset MCP-liittymäkohdat

- `find_symbol`: Käytä sitä tarkennetulla nimellä kuten `OrderBook::match`, kun tarvitset määrittelyn ja kutsujat.
- `dependency_search`: Käytä sitä ennen allekirjoituksen muutosta kantaluokkaan tai virtuaaliseen metodiin löytääksesi ylikirjoitukset ja kutsujat.
- `get_task_context`: Käytä sitä kehotteisiin kuten "selitä, miten markkinadataviesti päätyy strategiamoottoriin".
