2011-09-22 65 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,直到構造函數完成之後,它纔是安全的。