Domanda

C'è sempre come un modello di dipendenze che è impossibile per tenere tutto in File di intestazione solo? E se applicata una regola di una classe per solo intestazione?

Ai fini di questa domanda, cerchiamo di ignorare le cose statiche:)

È stato utile?

Soluzione

Sono a conoscenza di nessuna funzionalità nello standard C ++, ad eccezione statica che avete già menzionati, che richiedono una biblioteca per definire un'unità di traduzione completa (invece che solo le intestazioni). Tuttavia, non è consigliabile farlo, perché quando si fa, si forza tutti i tuoi clienti ricompilare l'intero codebase ogni volta che le modifiche di libreria. Se utilizzi i file di origine o di una libreria statica o una forma libreria dinamica della distribuzione, la libreria può essere modificata / aggiornata / modificata senza costringere tutti a ricompilazione.

Altri suggerimenti

E 'possibile, direi, alla condizione espressa di non utilizzare un certo numero di lingue. Caratteristiche: come avete notato, alcuni usi della parola chiave static

Si può richiedere un paio di trucco, ma possono essere riviste.

  1. sarà necessario mantenere la distinzione intestazione / fonte ogni volta che è necessario rompere il ciclo di dipendenza, anche se i due file saranno file di intestazione nella pratica.
  2. Free-funzioni (non-modello) devono essere dichiarati in linea, il compilatore non può in linea di loro, ma se sono dichiarati in modo che non si lamentava che essi sono stati ridefiniti quando il client builts sua biblioteca / eseguibile.
  3. A livello globale i dati (variabili globali e gli attributi di classe statiche) condiviso dovrebbe essere emulata mediante l'attributo statico locale nelle funzioni / metodi di classe. In pratica ha poca importanza per quanto riguarda il chiamante è interessato (aggiunge solo ()). Si noti che in C ++ 0x questo diventa il modo preferito perché è garantito per essere thread-safe pur proteggendo dal fiasco ordine di inizializzazione, fino ad allora ... non è thread-safe)

Il rispetto quei 3 punti, credo che sarebbe in grado di scrivere una libreria di testa solo a tutti gli effetti (qualcuno vede qualcosa che ho perso?)

Un certo numero di librerie Boost hanno usato trucchi simili per essere testata solo anche se il loro codice non era del tutto modello. Per esempio Asio fa molto consapevolmente e propone l'alternativa utilizzando bandiere (vedi note di rilascio per Asio 1.4.6 ):

  • i clienti che hanno bisogno di solo un paio di caratteristiche non devono preoccuparsi di costruire / collega, hanno solo afferrare ciò di cui hanno bisogno
  • i clienti che si affidano a un po 'più o vogliono ridurre il tempo di compilazione viene offerta la possibilità di costruire la propria libreria Asio (con i loro set di bandiere) e poi sono "leggeri" headers

In questo modo (al prezzo di un po 'di sforzo da parte degli sviluppatori di libreria) i clienti ottenere la botte piena e la moglie ubriaca. Si tratta di una bella soluzione abbastanza credo.

Nota: Mi chiedo se le funzioni static potrebbero essere inline, io preferisco usare i namespace anonimi me quindi mai veramente guardato dentro ...

L'una classe per regola intestazione è privo di significato. Se questo non funziona:

#include <header1>
#include <header2>

poi qualche variazione di questa volontà:

#include <header1a>
#include <header2>
#include <header1b>

Questo potrebbe risultare in meno di una classe per un colpo di testa, ma si può sempre utilizzare (void *) e calchi e funzioni inline (in questo caso il 'inline' probabilmente sarà debitamente ignorato dal compilatore). Quindi la domanda, mi sembra, può essere ridotta a:

class A
{
// ...
void *pimpl;
}

E 'possibile che l'attuazione privata, Pimpl, dipende dalla dichiarazione di A? Se è così allora pimpl.cpp (come intestazione) deve sia precedere e seguire A.H. Ma dal momento che è sempre possibile, ancora una volta, l'uso (void *) e calchi e funzioni inline in precedenti intestazioni, si può fare.

Naturalmente, potrei sbagliarmi. In entrambi i casi:. Ick

Nella mia lunga carriera, non ho incontrato modello dipendenza che non permetterebbe l'attuazione di testa-solo.

Mente che se si dispone di dipendenze circolari tra le classi, potrebbe essere necessario ricorrere a uno un'interfaccia astratta - paradigma concreta attuazione, o utilizzare i modelli (utilizzando i modelli consente di inoltrare riferimenti proprietà / metodi di parametri di modello, che vengono risolti successivamente durante esemplificazione).

Questo non significa che si dovrebbe sempre puntare a librerie di intestazione-only. Buona come sono, che dovrebbe essere riservato al modello e codice inline. Non dovrebbero includere sostanziali calcoli complessi.

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