2010-12-28 11 views
11

Ich muss eine Klasse schreiben, deren Konstruktor einen konstanten Verweis auf ein Objekt und speichert es lokal.C++: nicht temporäre const Referenz

Um die häufigsten Fehler zu vermeiden, die ich vorhersehen kann, möchte ich nur Verweise auf nicht-temporäre (dh: Referenzen auf lvalues) akzeptieren.

Wie kann ich eine Funktion schreiben, die konstante Referenzen nur auf nicht-temporäre verwendet?


Natürlich auch eine nicht nur vorübergehende außerhalb des Gültigkeitsbereichs gehen könnte und damit meine Klasse Verhalten zu brechen, aber ich glaube, dass temporäre Referenzen durch Verbieten werde ich die meisten Fehler vermeiden.

+0

Warum glaubst du, vermeidest du die meisten Fehler so? –

+0

Nun, das Objekt, dessen Referenz ich übergeben muss, muss nicht verwendet werden, nachdem es instanziiert wurde (dh ich instanziiere das Objekt und übergebe es, daher würde ich es aufgrund meines Codestils nicht auf dem Stapel instantiieren). Wenn ich vergesse, dass der Konstruktor einer anderen Klasse einen _permanenten_ Wert benötigt, sehe ich den vorübergehenden zurückgewiesenen (dh: kompilierten Zeitfehler), der sich an mich erinnern wird, hoffe ich. – peoro

Antwort

18

Wenn Sie einen Verweis speichern gehen und es verwenden müssen, nachdem der Konstruktor abgeschlossen ist, ist es wahrscheinlich am besten für den Konstruktor einen Zeiger zu nehmen:

struct C { 
    C(const X* p) : p_(p) { } 

    const X* p_; 
}; 

Auf diese Weise ist es ziemlich viel, dass Sie garantiert wird keinen Zeiger auf ein temporäres haben (es sei denn, X tut etwas wirklich dummes, wie das Überladen des unären &, um this zurückzugeben).

Wenn der Konstruktor einen Zeiger nimmt, ist es auch für die Benutzer der Klasse klarer, dass sie auf die Lebensdauer des X Objekts achten müssen, das sie an den Konstruktor übergeben.

+4

Saubere und intelligente Lösung! –

+1

Ja, stimme zu, saubere und intelligente Lösung! Ich werde auch behaupten, dass "p" nicht null ist, und wird es als Referenz speichern. – peoro

+0

Zustimmen, OP sollte lernen, dass Zeiger besser sind! Verwenden Sie Referenzen nur, wenn Sie unbedingt müssen (zB in Kopierern). – Yttrill

Verwandte Themen