2016-08-05 5 views
1

こんにちは、私は前に見たことのない方法で 'new'と他のスコープと静的修飾子を使うシングルトンクラスのコードスニペットを持っています。私はそれが何が呼び出されているのかわからないので、それが何をしているのかその目的についての情報を見つけることができません。以下のコード:myClass.hファイルでC++のシングルトンと新しい演算子

私は

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行目:何が起こっているか(新しい(p_myClass)myClass(); ).cppファイルの

3 - このようにクラスを使用する目的は何ですか?

私は本当にこの質問が繰り返しではないことを願っています。私はしばらくの間、答えを探しましたが、検索する用語を知りませんでした。助けてくれてありがとう。

+0

シングルトンを使いたくない場合はFWIWを参照してください。http://stackoverflow.com/questions/1008019/c-singleton-design-pattern – NathanOliver

+1

[シングルトンについてはどうなっていますか?](http ://stackoverflow.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)静的メンバー変数には、1つのコンパイル単位(.cpp/.cxx)に割り当てられた記憶域が必要です。この定義はそれを確立する。

2)これはプレースメントnewと呼ばれ、既に割り当てられたメモリにオブジェクトを構築することができます。オブジェクトが既に構築されており、構築が上書きされているので、この使用法には欠陥があります。

3)グローバルサービスをオブジェクトにカプセル化してシングルトンを持つと、そのサービスのクライアントが簡単にアクセスできるようになることがあります。

+0

新しいプレースメントをここでは完全にオフにすると、そのようにする必要はありません。 –