2016-06-23 2 views
0

私はシングルトンデザインパターンを理解しようとすると、最も単純なものを作成しました:C++でのシングルトンクラス作成時に静的関数が静的変数を参照できないのはなぜですか?

#include <iostream> 


class mySingleton{ 

private: 
    static mySingleton *ptr; 
    mySingleton(){ }  

public: 
    static mySingleton* getInstance(){ 
    if(!ptr){ 
     ptr = new mySingleton(); 
     return ptr; 
    } else return ptr; 
    } 

    void msg(){ 
    std::cout << " Hello World!! " << std::endl; 
    } 

}; 


int main(){ 

mySingleton* obj = mySingleton::getInstance(); 
mySingleton* obj2 = mySingleton::getInstance(); 

return 0; 
} 

私がコンパイルしようとする私が取得:

私は、静的な関数内でptrを使用することはできませんなぜ
Undefined symbols for architecture x86_64: 
"mySingleton::ptr", referenced from: 
    mySingleton::getInstance()  in ccm822LI.o 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 

、 ptrも静的変数なので?私はここに何かを逃していますか

答えて

7

ここに何か不足していますか?

はい、いくつかのこと:

  1. As mentionedあなたは、静的mySingletonポインタ変数の定義が欠落しています。
  2. あなたのコードは、それを実装する正しい方法はgetInstance()機能(別名Scott Meyer's Singleton)でローカル静的変数を使用することです安全
    スレッドされていません。

    static mySingleton* getInstance(){ 
        static mySingleton theInstance; 
        return &theinstance; 
    } 
    

    この実装は、スレッドであることが保証され安全で、メモリ割り当てを気にする必要はありません。ポインタを使用して

  3. は、おそらくあなたが戻り値の型

    static mySingleton& getInstance(){ 
           //^
        static mySingleton theInstance; 
        return theinstance; 
    } 
    
+0

答えをありがとうございました..私がラップしたい最後のもの私の頭の周り.. .. getInstance()は複数回呼び出すことができます...しかし、どのようにインスタンス化するオブジェクトは常に同じです..私は静的のためにそれを知っていますが、私は理解する必要があるものがまだ不足しています – pokche

+0

@pokche 'getInstance()'への1回目の呼び出しはインスタンスの作成をトリガーし、次の呼び出しは1回目の呼び出しと同じ結果を得ます。 –

+0

素晴らしい...私はそれが起こらなければならないようなことを知っていた...しかし、あなたは明らかに説明した...ありがとう:) – pokche

3
static mySingleton *ptr; 

クラス定義内の単なる宣言です。それは定義ではありません。

mySingleton * mySingleton::ptr = nullptr; 

クラス定義の外で定義する必要があります。

+0

@R Sahuだから私はクラスの静的mySingleton内PTRを定義することはできません* PTR = nullptrよう望むものではありません。私がそれをすると、コンパイルエラーが発生します。 – pokche

+2

@pokcheしかし、それは静的なメンバー*である必要はありません。それは 'getInstance'関数の中の静的変数である可能性があります。 – juanchopanza

+0

@juanchopanza daam right ur :) ..ありがとうございます – pokche

関連する問題