c ++在构造self期间传递* this作为参考

时间:2011-09-22 22:34:09

标签: c++ constructor reference this

以下是否安全?我知道,严格来说,在指向它的东西之前解除引用指针似乎很危险,但我想编译器只提供一个指针而不实际进行任何解除引用。好吧,我想。

(注意: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 个答案:

答案 0 :(得分:5)

  

(注意:gInst实际上直到很久才使用该引用。)

然后它是完全安全的。 (注意你说“参考”,而不是“价值”。)

由于你所说的原因,编译器会对此发出警告,但没有任何未定义的内容,只是“冒险”。请注意,您可以经常使用以下内容来编辑编译器警告(如果他们打扰您):

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

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

    bar b;
};

答案 1 :(得分:1)

简短的回答:也许,如果你小心的话。

答案很长:https://isocpp.org/wiki/faq/ctors#using-this-in-ctors

与您的具体问题有关:只要gInst真的是参考,那就没问题。

(命名空间系统中名为System的类,命名空间Sys?o.O)

答案 2 :(得分:1)

只要gInst从不访问gInst的数据成员或成员函数或尝试通过RTTI或dynamic_cast执行运行时类型内省,直到构造函数完成之后,它才是安全的。

答案 3 :(得分:0)

如何声明gInst?如果需要引用并将其存储为引用(Sys::System::System &)/指针(Sys::System::System *),则将其保险。如果它需要一个原始类(Sys::System::System)或将其存储为原始类,它将不安全,因为它将复制它。