Framework i C++, hur dölja ointressanta grejer?

Permalänk
Medlem

Framework i C++, hur dölja ointressanta grejer?

Hallå, som rubriken tyder på, hur döljer man ointressanta delar som detta framework är uppbyggt på, man vill ju endast ge användaren tillgång till det man skrivit/utökat själv tex, och utvalda delar?

Språk: C++.
Typ: Ärver in basen av detta framework i en klass, resten genom includes.

MVH
Dalton Sleeper

Permalänk
Medlem

jag är inte säker på att jag förstår vad du är ute efter, men om användaren använder ett framework så har han typiskt tillgång på en eller flera .h filer och något förkompilerat bibliotek. endast det som finns deklarerat i .h filerna är tillgängligt att använda utifrån, så du kan vara selektiv med vad du exponerar den vägen.

Permalänk
Medlem

Joo, tex att jag har inkluderat flera h filer från andra lib, sen har jag byggt ut funktioner & donat, om jag då har en h fil länkad till det jag byggt ut så har väll användaren tillgång till allt jag använt mig av, eller måste jag fula mig & berätta för mina filer att det finns en class av typen x, sen inkludera h filen i cpp filen ist, då får man väll inte tillgång till annat?

Tex om jag inkluderar nått som har med text att göra, text.h, sen kanske jag har använt mig av sdl ttf eller glut eller något för att åstadkomma resultatet, om jag då inkluderar text.h i användarens program så får dom ju tillgång till hela glut eller sdl... finns det inget smidigt sätt att göra detta?

Sen antar jag att det är bäst att kompilera detta på något sätt så man inte behöver använda källkoden?

Har verkligen noll koll på sådant :S

Permalänk

Ibland kan man lösa det genom att använda forward declarations som du nämnde, och sen inkludera sdlttf i text.cpp. Ibland kan det bli svårt eller för omständigt (samt att användaren av ramverket ändå hade kunnat se dina forwarddeklarationer).

En annan teknik som är ganska enkel är pImpl. Googla på det. Den kommer också med nackdelar.

Du kan också använda dig av arvshierarkier/interfaces för att åstakomma samma sak. Det beror på hur mycket flexibilitet du behöver. Interfaces kan också användas för att begränsa åtkomsten till vissa delar av en klass i vissa delar av koden.

Jag skulle gissa att du inte behöver interfaceklasser just nu, åtminstone inte till ditt exempel. Men det kan vara värt att läsa om det också. Vet inte hur pass etablerat begreppet är bara så det kanske inte är så lätt att söka på.

Permalänk
Medlem
Skrivet av Dalton Sleeper:

Hallå, som rubriken tyder på, hur döljer man ointressanta delar som detta framework är uppbyggt på, man vill ju endast ge användaren tillgång till det man skrivit/utökat själv tex, och utvalda delar?

Språk: C++.
Typ: Ärver in basen av detta framework i en klass, resten genom includes.

För den här typen av situationer kan ett alternativ vara att köra Pimpl-style. Alltså låt den publika klassen hålla en pekare till den klass som egentligen sköter allt, tillsammans med funktioner som endast skickar requests vidare till till den "riktiga" klassen. Dessa funktioner, tillsammans med den "riktiga" klassen, definieras i implementationsfilen. Då räcker en enkel forwarddeklaration i headerfilen.

Skrivet av Dalton Sleeper:

Joo, tex att jag har inkluderat flera h filer från andra lib, sen har jag byggt ut funktioner & donat, om jag då har en h fil länkad till det jag byggt ut så har väll användaren tillgång till allt jag använt mig av, eller måste jag fula mig & berätta för mina filer att det finns en class av typen x, sen inkludera h filen i cpp filen ist, då får man väll inte tillgång till annat?

Tex om jag inkluderar nått som har med text att göra, text.h, sen kanske jag har använt mig av sdl ttf eller glut eller något för att åstadkomma resultatet, om jag då inkluderar text.h i användarens program så får dom ju tillgång till hela glut eller sdl... finns det inget smidigt sätt att göra detta?

Har du en headerfil som deklarerar en funktion med ett argument av typen SDL_Font *, borde nämnda headerfil på ett eller annat sätt göra SDL_Font * tillgänglig. Antingen genom att inkludera passande fil, eller genom att forward-deklarera typen (vilket kan vara bättre i de fall där dina funktioner bara tar pekare till argumenten). Annars går kompileringen av ett program sönder bara genom att din headerfil inkluderas. Används nämnda SDL_Font-typ endast i implementationen behövs den dock inte i headerfilen.

I vissa fall går det även att välja att inkludera bara den fil som deklarerar eller definierar datatypen, vilket kan vara ett alternativ för headerfilen, så behöver inte hela biblioteket dras in.

Skrivet av Dalton Sleeper:

Sen antar jag att det är bäst att kompilera detta på något sätt så man inte behöver använda källkoden?

Det finns i huvudsak två vanliga alternativ: statiskt bibliotek eller dynamiskt bibliotek. Kompilerar du till detta behöver användare av biblioteket sedan bara inkludera dina headerfiler och länka statiskt eller dynamiskt till biblioteket.

Visa signatur

Vill du ha svar? Citera mig gärna.

Permalänk
Medlem

Okey, vad intressant, ska läsa på lite mer om detta
Tackar för tipsen!