C ++ - È una buona idea creare intestazioni separate come API?

1

Diciamo che ho un codice di libreria main.cpp , dove sono implementate 3 classi: Inner1 , Inner2 e Outer . Inner1 e Inner2 vengono utilizzati solo in main.cpp e non verranno utilizzati da nessun'altra parte.

D'altra parte, la classe Outer è destinata all'utilizzo da parte degli utenti della mia libreria, vale a dire una parte dell'API. Inoltre, non voglio che i miei utenti utilizzino le classi interne.

È un buon modo per risolvere questo problema con due intestazioni - main_api.h , dove verrà dichiarata Outer class e main.h , dove verranno dichiarate entrambe le classi interne?

O c'è un modo migliore per affrontare questo problema?

    
posta Eenoku 07.09.2018 - 20:21
fonte

2 risposte

3

Molto è questione di gusti e convenzioni di denominazione locale. Ma di sicuro, dovresti dividere la parte dell'API in un'intestazione separata.

Un approccio tipico sarebbe avere ciascuna definizione di classe in un file di intestazione, come Inner1.h , Inner2.h e Outer.h . L'utente API userebbe sempre solo Outer.h (forse non sa nemmeno che ce ne sono altri).

    
risposta data 07.09.2018 - 20:23
fonte
2

Non importa come dividi le intestazioni, perché tutte loro finiranno per essere incluse. Il consumatore della tua intestazione non vede alcuna differenza. Quindi probabilmente è meglio continuare a utilizzare una singola intestazione.

Ma è comprensibile che tu voglia contrassegnare le classi interne come interne. Esistono due approcci, in base ai tuoi obiettivi:

  • Se desideri fornire incapsulamento totale delle tue classi interne, utilizza idi idi pImpl (puntatore opaco) . Il file di intestazione quindi contiene solo l'API pubblica della classe esterna, ma nessun riferimento alle classi interne. Invece, metti le classi interne nel tuo file .cpp - l'unico posto in cui vengono utilizzate. Idealmente li si racchiude anche in uno spazio dei nomi anonimo per fornire loro un collegamento interno. Ciò consente di evitare errori del linker e rende possibili ulteriori ottimizzazioni.

  • Se l'incapsulamento è meramente informativo , quindi inserisci le classi interne in namespace detail { ... } nell'intestazione. Il nome detail è semplicemente una convenzione, qualsiasi nome che comunica chiaramente che il suo contenuto è interno farà. Questa tecnica potrebbe essere necessaria se le classi interne forniscono modelli.

risposta data 07.09.2018 - 20:41
fonte

Leggi altre domande sui tag