Ich überschreibe einige Code, um globale Variablen zu beseitigen, und machte eine Klassenkonstruktor/Destruktor-Bereinigung von einigen Drittanbieter-Bibliothek Ressourcen, aber ich bin besorgt über etwas Code, der ein Mitglied aus einem anderen Mitglied in der Klasseninitialisierungsliste initialisiert.Kann ich C++ - Klassenmitglieder verwenden, die in der Initialisierungsliste initialisiert wurden, später in der Liste?
class MyPodofoDocument {
public:
// generates pdf to stream
MyPodofoDocument(std::stringstream *pStringStream)
: device(pStringStream), document(&device)
{
}
private:
PoDoFo::PdfOutputDevice device;
PoDoFo::PdfStreamedDocument document;
PoDoFo::PdfPainter painter;
};
Der Code, der diese Klasse verwendet, muss nicht alle Details, um zu sehen, die die Bibliothek gehen in Verwendung, aber die Art, wie ich sie verstecken macht es abhängig von Mitgliedern mit anderen Mitgliedern zu initialisieren, bevor es die Hits Konstruktors tatsächlicher Codeblock, wo er einen gültigen Zeiger hat.
Es funktioniert in einem Unit-Test-Skelett, so ist meine Frage im Grunde: "Ist das in Ordnung, tragbar und sicher?"
Darüber hinaus ist es legal, die Adresse zu erhalten oder einen Verweis auf ein noch zu erstellendes Element zu binden (dh Sie können später einen Verweis auf ein deklariertes Element übergeben, wenn der Empfänger * das Objekt * nicht verwendet, sondern nur den Verweis/Zeiger). –
Es ist zulässig, zu übergeben, aber semantisch falsch, da Sie einen Zeiger auf etwas geben würden, das noch nicht konstruiert wurde. –
@AlexChamberlain: Nichts ist daran falsch, aber wahrscheinlich braucht es einen Doppel-Check. – GManNickG