2013-06-07 11 views
6

Ich habe eine C++ project. Ich arbeite an dem Projekt, um mir beizubringen, ein semi-realistisches Programm in C++ zu erstellen. Es lädt Inhalt rekursiv von einer Website.C++ Darstellen von optionalen Objekten

Jeder Download enthält eine URL für den herunterzuladenden Inhalt sowie eine URL für den Referrer (oder die URL der Seite, von der der Inhalt extrahiert wurde).

Es gibt immer einen Referrer, es sei denn, es ist die allererste URL. Ich hatte betrogen und nur die erste URL als eigenen Referrer behandelt. Ich habe vor kurzem die URL-Klasse geändert, um eine leere (oder leere) Darstellung zu haben. Das fühlt sich an wie ein Hack.

Gibt es eine Möglichkeit optionale Objekte in C++ zu repräsentieren ohne:

  • Zeiger verwenden?
  • Speicherplatz für das ungültige Objekt verschwenden?
  • oder Eine "leere" Version des Objekts erstellen?
+0

W \ O: Zeiger verwenden? IMHO nicht. – Najzero

Antwort

5

Sie könnten boost :: optional verwenden. Boost ist eine angesehene 3rd-Party-Bibliothek; oft als Prototyp für neue stl-Funktionen angesehen: Siehe Ralphs Antwort std :: optional ist mit neuem C++ verfügbar.

Siehe http://www.boost.org/

+0

Ich habe das ursprünglich als Kommentar gepostet, aber wird das nicht Platz für die "leere" Version verschwenden? Nicht dass ich denke, dass es ein ernstes Problem ist, aber es ist eine der spezifischen Anforderungen der Frage. – BoBTFish

+2

Nein. Boost :: optional verwendet einen Zeiger, der in seiner Implementierung auf NULL gesetzt ist. Ich weiß nicht, wie std :: optional funktioniert. – Bathsheba

+0

@Bathsheba Ich versuche nur zu vermeiden, etablierte Konventionen neu zu erfinden. Ich habe 'unique_ptr' verwendet, aber ich habe festgestellt, dass der Code uneinheitlich aussieht. Ich fühlte, dass es nicht explizit sagte "dieses Feld ist optional". Stattdessen sah es wie eine Speicherverwaltungstechnik aus. –

5

die std::optional Vorlage verwenden, wenn Sie einen C++ 14-Compiler. Wenn nicht, können Sie boost::optional oder std::unique_ptr verwenden. Sie können nicht vermeiden, dass Sie Zeiger verwenden und Speicherplatz für das ungültige Objekt verschwenden. std::optional enthält das optionale Objekt, std::unique_ptr wird offensichtlich darauf hinweisen.

+0

+1 für dich Ralph: Ich muss wirklich in ein neueres C++ umziehen ;-) – Bathsheba

Verwandte Themen