2016-08-05 78 views
1

嗨我有一個代碼片段是一個單身類(我相信),使用'新'和一些其他範圍和靜態限定符以我沒有見過的方式。因爲我不知道它叫什麼,所以我找不到它所做的或它的目的的任何信息。下面的代碼:C++單身人士和新運營商

在myClass.h文件我有

class myClass 
{ 
private: 
    static myClass sm_myClass; 
    myClass(); 
public: 
    static void Create(void); 
}; 

,並在myClass.cpp我

#include "myClass.h" 
#include <new> 

myClass* p_myClass = NULL; 

myClass myClass::sm_myClass; 

myClass::myClass() 
{ 
} 

void myClass::Create(void) 
{ 
    p_myClass = &sm_myClass; 

    new (p_myClass) myClass(); 
} 

我的問題是:

1 - 這是怎麼回事在.cpp文件的第6行(myClass myClass :: sm_myClass;)

2 - 第16行發生了什麼(new(p_myClass)myClass(); )的.cpp文件

3 - 以這種方式使用類的總體目的是什麼?

我真的很希望這個問題不是重複。我搜索了一段時間的答案,但不知道甚至搜索什麼條件。謝謝你的幫助。

+0

FWIW如果你要使用單例見:http://stackoverflow.com/questions/1008019/c-singleton-design-pattern – NathanOliver

+1

你也許還想讀[單身人士有什麼不好?](http ://sackoverflow.com/questions/137975/what-is-so-bad-about-singletons?rq = 1) –

+1

對象'sm_myClass'在程序啓動時生成。對放置的調用新嘗試在已有的對象上構建一個新的對象,給出未定義的行爲。 –

回答

4

1 - 什麼是在第6行(MyClass的MyClass的:: sm_myClass)發生的cpp文件

靜態類成員的定義。

2 - 什麼是在線路16發生(新(p_myClass)MyClass的();).cpp文件的

放置新指定重新使用分配給p_myClass

存儲器

3 - 以這種方式使用課程的總體目的是什麼?

有些時候單身可能會派上用場,但一般最好是通過周圍的接口,而不是緊耦合的客戶端代碼myClass


不要使用new(放置new與否)來初始化單實例。使用斯科特·梅耶的單執行,而不是,這保證線程安全:

class myClass 
{ 
private: 
    myClass(); 
public: 
    static myClass& instance() { 
     static myClass theInstance; 
     return theInstance; 
    } 
}; 

實例將首先訪問instance()功能來創建,並保持相同的任何後續調用。

+0

只是一個精度,這是線程安全的,因爲C++ 11。這不是在C++ 03 – wasthishelpful

+1

@wasthishelpful那麼,我專注於當前的標準,而不是老年人的缺陷。 –

+1

我也是:)但我們不是每個人) – wasthishelpful

3

1)靜態成員變量需要在一個編譯單元(.cpp/.cxx)中分配存儲空間。這個定義確定了這一點。

2)這被稱爲placement new,它允許你在已經分配的內存中構造一個對象。由於該對象已經被構建並且該構造被覆蓋,所以這種用法是有缺陷的。

3)有時將全局服務封裝到一個對象中並且使用單例爲服務的客戶端提供一種訪問該服務的簡單方法是很方便的。

+0

使用貼圖新功能完全在這裏,沒有理由這樣做。 –