Domanda

Sto lavorando su un insieme di classi utilizzate per la registrazione e riproduzione video.Ho una classe principale che agisce come interfaccia pubblica, con metodi simili play(), stop(), pause(), record() ecc...Poi ho il cavallo di battaglia di classi che fanno la decodifica video e la codifica del video.

Ho appena imparato a conoscere l'esistenza di classi nidificate in C++, e sono curioso di sapere ciò che i programmatori pensano circa il loro utilizzo.Io sono un po ' diffidente e non proprio sicuro di quello che i vantaggi/svantaggi sono, ma sembrano (secondo il libro che sto leggendo) per essere utilizzato in casi come il mio.

Il libro suggerisce che in uno scenario come il mio, una buona soluzione sarebbe quella di nido il cavallo di battaglia delle classi all'interno dell'interfaccia della classe, quindi non ci sono file separati per le classi il client non è pensato per l'utilizzo e per evitare eventuali conflitti di denominazione?Io non so queste giustificazioni.Classi nidificate sono un concetto nuovo per me.Voglio solo vedere quello che i programmatori pensare al problema.

È stato utile?

Soluzione

Vorrei essere un po ' riluttanti a utilizzare le classi nidificate qui.Che cosa succede se si è creata una classe base astratta per un "multimedia driver" per la gestione del back-end di roba (cavallo di battaglia), e di una classe separata per il front-end di lavoro?Il front-end di classe può prendere un puntatore di riferimento per implementare un driver di classe (per il supporto appropriato e situazione) e di eseguire il astratti operazioni sul cavallo di battaglia della struttura.

La mia filosofia sarebbe quella di andare avanti e fare entrambe le strutture accessibili al cliente in modo lucido, appena sotto l'ipotesi che potrebbe essere utilizzato in tandem.

Mi farebbe riferimento a qualcosa di simile a un QTextDocument in Qt.Si fornisce un collegamento diretto con il metallo nudo del trattamento dei dati, ma passare l'autorità lungo un oggetto come un QTextEdit a che fare con la manipolazione.

Altri suggerimenti

Utilizzare una classe nidificata per creare un (piccolo) classe di supporto che è necessario per implementare la classe principale.O per esempio, per definire un'interfaccia (una classe con metodi astratti).

In questo caso, il principale svantaggio delle classi nidificate è che questo rende più difficile il riutilizzo di loro.Forse si desidera utilizzare il vostro VideoDecoder classe in un altro progetto.Se fai una classe nidificata di VideoPlayer, non si può fare questo in un modo elegante.

Invece, mettere le altre classi separate .h/.cpp i file, che è possibile utilizzare nella vostra classe VideoPlayer.Il client di VideoPlayer ora deve solo includere il file che dichiara VideoPlayer, e ancora non ha bisogno di sapere su come è implementato.

Un modo per decidere se usare o meno le classi nidificate è pensare a se o non questa classe svolge un ruolo di supporto o di essa la propria parte.

Se esiste per il solo scopo di aiutare un'altra classe quindi io di solito fare una classe nidificata.Ci sono un sacco di cose a che, alcuni dei quali sono contraddittorie, ma che si tratta di esperienza e intestino-sensazione.

suona come un caso in cui si potrebbe utilizzare il modello di strategia

A volte è proprio il caso di nascondere le classi di implementazione da parte dell'utente -- in questi casi è meglio metterli in un foo_internal.h rispetto all'interno della pubblica definizione di classe.In quel modo, i lettori del tuo pippo.h non vedere ciò che si preferisce non essere turbato, ma si può ancora scrivere test contro ogni concrete implementazioni dell'interfaccia.

Abbiamo raggiunto un problema con un semi-old Sun compilatore C++ e la visibilità delle classi nidificate cui comportamento è cambiato nella norma.Questo non è un motivo per non fare la tua classe nidificata, naturalmente, solo qualcosa di cui essere consapevoli di se avete intenzione su come compilare il software su un sacco di piattaforme, tra cui vecchi compilatori.

Beh, se si utilizzano i puntatori per il tuo cavallo di battaglia delle classi nell'Interfaccia di classe e di non esporre come parametri o i tipi di ritorno nei vostri metodi di interfaccia, non è necessario includere le definizioni per i cavalli nella vostra interfaccia di file di intestazione (appena avanti dichiarare loro, invece).In questo modo gli utenti dell'interfaccia, non è necessario conoscere le classi in background.

Sicuramente non hanno bisogno di nido classi per questo.Infatti, separare i file di classe sarà effettivamente rendere il codice molto più leggibile e più facile da gestire come il progetto cresce.essa aiuterà anche in seguito, se avete bisogno di sottoclasse (dire per i vari contenuti/tipo di codec).

Qui maggiori informazioni sul PIMPL modello (sezione 3.1.1).

Si dovrebbe usare una classe interna solo quando non è possibile implementarlo come una classe separata utilizzando l'esterno classe' interfaccia pubblica.Classi interne aumentare la dimensione, la complessità e la responsabilità di una classe, in modo che essi dovrebbero essere usati con parsimonia.

Il codificatore/decodificatore di classe sembra meglio si adatta l' Modello Di Strategia

Una ragione per evitare di classi nidificate è se mai intenzione di inserire il codice con sorso (http://www.swig.org) per l'utilizzo con le altre lingue.Sorso attualmente ha problemi con le classi nidificate, in modo da interfacciarsi con librerie che espongono ogni classe interna diventa un vero e proprio dolore.

Un'altra cosa da tenere a mente è se mai immaginare diverse implementazioni delle funzioni di lavoro (ad esempio di codifica e decodifica).In quel caso, si sarebbe sicuramente desidera una classe base astratta concrete classi che implementano le funzioni.Non sarebbe in realtà essere opportuno nido separata sottoclasse per ogni tipo di implementazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top