2014-01-14 122 views
0

我想創建一個extern指針,從該靜態對象內的靜態對象的值。我們將稱這個對象爲Foo。如何從該對象中獲取靜態對象的值?

到目前爲止,我得到這個工作的唯一方法是創建一個Foo繼承的Supervisor類,它包含兩個靜態類型變量。一個叫做superObject的是實際的初始化對象。另一個叫做superPointer,是一個相同類型的雙指針。在Foo對象的內部,我聲明瞭一個名爲TheSupervisor的extern指針併爲其分配一個nullptr。然後,從Supervisor基類中,我使用雙指針superPointer將TheSupervisor extern指針的值更改爲superObject的地址。 Wallah。

目標是在這裏創建一個全局可訪問的此對象的引用。盡我所能避免單身,保持線程安全。我只是想知道是否有更好的方法?

我會發布代碼,但我真的要清理它並改變它。我認爲描述就足夠了。實際上可能更簡單。

編輯:事實證明,對於靜態對象,我不能依賴於何時以及以何種順序構建它們。使用單相過程不適用於此。相反,我必須依靠一個兩階段的過程,比如我上面概述的過程。標記 Ilya Kobelevskiy的回答是正確的,因爲它演示了一種做法,但同樣,它應該在與靜態對象一起使用時出現警告。

+0

爲什麼沒有單身? – Micka

+0

好問題。這個Foo類實際上是一個模板類。對於這種特定類型的Foo,我使用模板專門化進行初始化,然後創建全局訪問權限,如上所述。我只想要其中之一。然而,對於其他類型,這些事情不會發生,我可以有不止一個。這是否回答你的問題? – Stradigos

回答

1

也許我忽視的東西,但不會

class Foo 
{ 
//some methods 
public: 
Foo* getSelf() const { return this;} 
} 

只是工作?

+0

標記爲答案,但請參閱上面有關其與靜態對象一起使用的編輯。 – Stradigos

+0

@Stradigos我認爲你是在過度思考它。請注意,方法getSelf()是*非靜態的*。因此,不需要對對象創建順序做任何假設 - 只有在創建對象後才能從現有對象調用方法,並且它會返回一個指向該對象的指針 - 對象是靜態的還是不重要的比賽。 –

+0

你可能是對的。我會研究它! – Stradigos

0

我想了解您在上述評論中所說的內容,但我不確定這是否是您要找的內容。

class Foo 
{ 
    public: 
     Foo(); 
     static Foo* shared_instance() {return &shared_instance_;}; 

    private: 
     static Foo shared_instance_; 
} 

這樣,您就可以使用共享實例作爲是,或實例化新的時候,如果需要用到。