# C++ i Maguyva: klasse- og kallgrafer for store kodebaser

Canonical source: https://maguyva.ai/nb/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 støtter C++ med AST, symboler og graf, slik at AI-agenter kan følge klasser, navnerom, virtuelle overstyringer og kallere i store C++-kodebaser.

## Støtteoversikt

- Nivå: AST- og symbolstøtte
- Programmering
- Filendelser: .c, .c++, .cc, .cpp, .cxx, .h, +4 til
- Ekte AST-analyse for syntaksbevisst søk og strukturell kontekst.
- Navngitte symboler mater semantisk oppslag og kryssreferanser. Grafnavigasjon er tilgjengelig når relasjonsuttrekk er aktivert.
- Dette språket bidrar med symboler og relasjoner til grafbasert søk; støttede kanttyper varierer med språkets egne konstruksjoner.
- Både AST-analyse og symboluttrekk er tilgjengelige.

## Best egnet

- Spillmotorer, handelssystemer, nettlesere og andre store C++-kodebaser der én endret header bygger om halve treet.
- Klassehierarkier med virtuelle metoder, der metoden som kjører, er definert et annet sted enn der den kalles.
- Agentstøttet refaktorering som trenger kallere og overstyringer før en signaturendring.

## Agent-arbeidsflyter

- Finne alle overstyringer av en virtuell metode før basisklassen endres.
- Liste kallere i hele kodebasen til en funksjon eller klassemetode i et navnerom, for eksempel `net::Socket::send`.
- Spore hvor en klasse opprettes med `new`, og hvilke medlemmer den berører etterpå.

## Hvorfor C++ trenger struktur, ikke tekstsøk

I C++ er navn ikke unike. `send` kan være en fri funksjon, et medlem av tre klasser og en overstyring i en fjerde. Navnerom, templates og definisjoner utenfor klassen, som `Socket::send` i en `.cpp`-fil, sprer én type over mange filer. Tekstsøk returnerer hvert treff, men forteller ikke en agent hvilket av dem et kall treffer.

Maguyva indekserer klasser, medlemmer og kall sammen med eierne deres, slik at en agent kan følge den reelle strukturen før den redigerer.

## Hva Maguyva henter ut i C++

Maguyva dekker de vanlige filendelsene for C++-kildekode og headere, blant annet `.cpp`, `.cc`, `.cxx`, `.hpp`, `.hh` og `.hxx`. Klasser, structs og funksjoner hentes ut, og en definisjon utenfor klassen som `void Socket::send()` tilskrives eierklassen og navnerommet sitt. Virtuelle medlemmer registreres, og templateparametere er en del av signaturene.

Mottakertypingen følger parametere, lokale deklarasjoner, felt, områdebaserte `for`-løkker og `auto`, og ser gjennom `unique_ptr`, `shared_ptr` og `optional`, så et kall som `conn->send()` kan løses til riktig klasse. Basisklasseklausuler gir grunnlag for arv, og `new`-uttrykk teller som instansiering.

Den samme maskeringen av eksport- og annoteringsmakroer som i C gjelder. Rundt 273 navn i standardbiblioteket (`std::cout`, `std::endl`, `printf` og lignende) filtreres ut av relasjonene. Grafen registrerer kall, includes, arv, overstyringer, instansiering, typereferanser, lesinger og skrivinger samt `throw`-kanter.

## Eksempler på prompter for agenter

- «Hvilke klasser overstyrer `Renderer::draw`, og hvem kaller den?» (`dependency_search`)
- «Vis meg `OrderBook::match` og alle som kaller den.» (`find_symbol`)
- «Forklar hvordan en markedsdatamelding når strategimotoren.» (`get_task_context`)

## Kjente begrensninger

- `.h` står på listene over filendelser for C, C++ og Objective-C, så i trær som blander C og C++, deles headere mellom disse profilene.
- Kropper i objektlignende makroer parses ikke, og kall til filtrerte navn i standardbiblioteket er ikke kanter i grafen. Bruk `text_pattern_search` for makroer og bruk av `std::`.

## Neste steg

Koble til et repositorium med [hurtigstarten](/nb/docs/quickstart), og se deretter støttematrisen på [kompatibilitetssiden](/nb/docs/compatibility). Hvis deler av treet er ren C, bør du også lese [veiledningen for C](/nb/languages/c).

## Motordetaljer

- Definisjoner utenfor klassen som `void Socket::send()` tilskrives eierklassen og navnerommet sitt, og virtuelle medlemmer registreres.
- Mottakertypingen følger parametere, lokale variabler, felt, områdebasert `for` og `auto`, og ser gjennom `unique_ptr`, `shared_ptr` og `optional`.
- Basisklasseklausuler gir grunnlag for arv, `new`-uttrykk teller som instansiering, og rundt 273 navn i standardbiblioteket filtreres ut av relasjonene.

## Nyttige MCP-inngangspunkter

- `find_symbol`: Bruk det for et kvalifisert navn som `OrderBook::match` når du trenger definisjonen og kallerne.
- `dependency_search`: Bruk det på en basisklasse eller virtuell metode før en signaturendring for å finne overstyringer og kallere.
- `get_task_context`: Bruk det til prompter som «forklar hvordan en markedsdatamelding når strategimotoren».
