Przepisuję trochę kodu, aby wyeliminować zmienne globalne i uczyniłem funkcję konstruktora klasy/destruktora w celu czyszczenia niektórych zasobów biblioteki stron trzecich, ale niepokoi mnie kod inicjujący jednego członka z innego elementu na liście inicjatora klasy.Czy mogę używać członków klasy C++ zainicjowanych na liście inicjalizacyjnej, a później na liście?
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;
};
Kod, który korzysta z tej klasy nie muszą zobaczyć wszystkie szczegóły, które go do korzystania z biblioteki, ale sposób w jaki je ukryć sprawia, że uzależnieni od członków zainicjować innych członków, zanim dotrze on do rzeczywisty blok kodu konstruktora, gdzie ma poprawny ten wskaźnik.
Działa w jednostce szkieletu testowego, więc moje pytanie brzmi: "Czy to jest w porządku, przenośne i bezpieczne?"
Ponadto legalne jest uzyskanie adresu lub powiązanie odniesienia z jeszcze nieodbudowanym członkiem (tzn. Można przekazać referencję do członka zadeklarowanego później, jeśli odbiorca nie * używa * obiektu, ale przechowuje jedynie referencję/wskaźnik). –
Jest legalne, ale semantycznie błędne, ponieważ przekazujesz wskaźnik do czegoś, co nie zostało jeszcze skonstruowane. –
@AlexChamberlain: Nie ma w tym nic złego, ale prawdopodobnie potrzebna jest podwójna kontrola. – GManNickG