2011-09-22 19 views
2

以下是否安全?严格地说,我知道,在它指向的东西被正确构造之前解引用指针看起来很危险,但我想象编译器只是提供一个指针而不实际进行任何解引用。好吧,我想。C++在自己的施工过程中以*为参考

(注意: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&); 
     }; 
    } 
} 

部首乙

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(); 
    } 
} 
+0

它取决于'gInst'函数,你没有在这里显示。如果它只存储指针/引用,并且在ctor抛出时不使用它,那么你很好。 –

+0

如果ctor抛出,然后gInst的析构函数被调用,对吧?暗示'gInst'的析构函数最好不要认为它传递的'System'对象是好的。 –

回答

4

(注:gInst实际上并未使用的参考直到很久以后)

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

编译器只会为你说的原因提出警告,但没有什么没有定义它,只是“有风险”。请注意,您可以经常王牌编译器警告(如果他们打扰你)有这样的事情:

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

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

    bar b; 
}; 
0

gInst是怎么样的ED?如果它需要参考并将其作为参考(Sys::System::System &)/指针(Sys::System::System *)将其保存。如果它需要一个原始类(Sys::System::System)或将其存储为原始类,则它将不会安全,因为它将复制它。

1

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

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

与您的具体问题:这很好,只要gInst真的是一个参考。

(一个在命名空间Sys系统的命名空间系统称为System类?OO)

+0

不幸的是,链接已损坏。 – jupp0r

1

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