C ++ Передача * это как ссылка во время конструирования себя - PullRequest
2 голосов
/ 23 сентября 2011

Безопасно ли следующее?Я знаю, строго говоря, разыменование указателя до того, как объект, на который он указывает, правильно сконструировано, кажется опасным, но я представляю, что компилятор просто предоставит указатель без фактической разыменования.Ну, я полагаю.

(Примечание: gInst на самом деле не использует ссылку намного позже.)

TU 1

Sys::System::System::System(const sf::VideoMode& rVM, const std::string& rSTR, unsigned long settings) :
    win(rVM, rSTR, settings),
    gInst(*this)
{

}

Заголовок A

namespace Sys
{
    namespace System
    {
        struct System;
    }

    namespace UI
    {
        struct GUI
        {
            System::System& topl;
            MenuBar menu;

            GUI(System::System&);

            private:

            GUI();
            GUI(const GUI&);
            GUI& operator=(const GUI&);
        };
    }
}

Заголовок B

namespace Sys
{
    namespace System
    {
        struct System
        {
            sf::RenderWindow win;
            Sys::UI::GUI gInst;
            Sys::Editor::Editor eInst;

            System(const sf::VideoMode&, const std::string&, unsigned long);

            private:

            System();
            System(const System&);
            System& operator=(const System&);
        };

        void start();
    }
}

Ответы [ 4 ]

5 голосов
/ 23 сентября 2011

(Примечание: gInst на самом деле не использует ссылку намного позже).

Тогда это абсолютно безопасно.(Принимая к сведению, что вы говорите «ссылка», а не «значение».)

Компиляторы просто предупредят об этом по указанной вами причине, но в этом нет ничего неопределенного, просто «рискованно».Обратите внимание, что вы часто можете превзойти предупреждения компилятора (если они вас беспокоят) примерно так:

struct foo
{
    foo() : b(self())
    {}

private:
    foo& self() { return *this; }

    bar b;
};
1 голос
/ 23 сентября 2011

Пока gInst никогда не обращается к элементу данных или функции-члену gInst или пытается выполнить самоанализ типа во время выполнения через RTTI или dynamic_cast, пока конструктор не завершит работу, он безопасен.

1 голос
/ 23 сентября 2011

Краткий ответ: может быть, если вы осторожны.

Длинный ответ: https://isocpp.org/wiki/faq/ctors#using-this-in-ctors

Относительно вашей конкретной проблемы: Это хорошо, пока gInst действительноreference.

(класс System в пространстве имен System в пространстве имен Sys? oO)

0 голосов
/ 23 сентября 2011

Как объявляется gInst? если он берет ссылку и сохраняет ее как ссылку (Sys::System::System &) / указатель (Sys::System::System *), то это безопасно. Если он принимает необработанный класс (Sys::System::System) или сохраняет его как необработанный класс, он не будет безопасным, поскольку скопирует его.

...