2013-06-07 8 views
6

I have a C++ project. Lavoro sul progetto per insegnarmi a costruire un programma semi-realistico in C++. Scarica i contenuti in modo ricorsivo da un sito Web.C++ Rappresentazione di oggetti opzionali

Ogni download ha un URL per il contenuto da scaricare, nonché un URL per il referrer (o l'URL della pagina da cui è stato estratto il contenuto).

C'è sempre un referente a meno che non sia il primo URL. Avevo imbrogliato e trattavo il primo URL come proprio referente. Di recente ho modificato la classe URL per avere una rappresentazione vuota (o vuota). Questo sembra un hack.

Esiste un modo per rappresentare oggetti opzionali in C++ senza:

  • Usando puntatori?
  • Sprecare spazio per l'oggetto non valido?
  • o Esecuzione di una versione "vuota" dell'oggetto?
+0

W \ O: utilizzo dei puntatori? IMHO no. – Najzero

risposta

5

È possibile utilizzare boost :: facoltativo. boost è una libreria di terze parti ben rispettata; spesso considerato come un prototipo per nuove funzioni di stl: vedi la risposta di Ralph std :: opzionale è disponibile con il nuovo C++.

Vedi http://www.boost.org/

+0

Originariamente l'ho postato come commento, ma non sprecherò spazio per la versione "vuota"? Non che io pensi che sia un problema serio, ma è uno dei requisiti specifici della domanda. – BoBTFish

+2

No. boost :: facoltativo utilizza un puntatore, impostato su NULL come appropriato, nella sua implementazione. Non so come std :: lavori opzionali. – Bathsheba

+0

@Bathsheba Sto solo cercando di evitare di reinventare le convenzioni stabilite. Ho usato 'unique_ptr' ma ho deciso di far sembrare il codice sbilenco. Ho sentito che non stava dicendo esplicitamente "questo campo è facoltativo". Invece sembrava una tecnica di gestione della memoria. –

5

Utilizzare il modello std::optional, se si dispone di un C++ 14 compilatore. In caso contrario, è possibile utilizzare boost::optional o std::unique_ptr. Non puoi evitare di usare entrambi i puntatori e sprecare spazio per l'oggetto non valido. std::optional conterrà l'oggetto facoltativo, std::unique_ptr ovviamente lo indicherà.

+0

+1 per te Ralph: Ho davvero bisogno di passare a un C++ più recente ;-) – Bathsheba