2011-01-18 7 views
0

クラスの1つのインスタンスへのポインタを返すスタティックメンバ関数を作成しようとしています。これはC++で可能ですか?スタティッククラス関数を使用してシングルトンオブジェクト/インスタンスを作成する

class DynamicMemoryLog 
{ 
    // Singleton Class: 

    public: 

     static DynamicMemoryLog* CreateLog(); 
     void AddIObject(IUnknown* obj); 
     void ReleaseDynamicMemory(); 

    private: 
     // static DynamicMemoryLog* instance; 
     static bool isAlive; // used to determine is an instance of DynamicMemoryLog already exists 

     DynamicMemoryLog(); 
     ~DynamicMemoryLog(); 

     std::vector <IUnknown*> iObjectList; 
}; 

この関数は、以下のそのオブジェクトへのポインタを返す&クラスの新しいインスタンスを作成する必要がありますが、それはポインタを返した場合、コンパイラは、私はクラスの静的関数を定義することはできません(私はthatsのは考えますなぜコンパイルできないのですか?):

static DynamicMemoryLog* DynamicMemoryLog :: CreateLog() 
{ 
    // Post: 

    if (!isAlive) // (instance == NULL;) 
    { 
     DynamicMemoryLog* instance = new DynamicMemoryLog(); 
     return instance; 
    } 

    return NULL; 
} 
+1

エラーメッセージは何ですか? – sharptooth

+0

DynamicMemoryLog.cpp(17):エラーC2724: 'DynamicMemoryLog :: CreateLog':ファイルスコープで定義されたメンバ関数で 'static'を使用しないでください – Sascha

+0

複数のシングルトンクラスがリンクされているか、ロギングクラスは、プログラムの終了時に最後に削除または解放する必要があります。したがって、「オブジェクトライフタイム」管理を念頭に置いてください。通常、ほとんどの開発者はこれをスキップします。 –

答えて

1

ここでは最も簡単な解決策はありますが、スレッドセーフではありません。分析の詳細については、this articleをご覧ください。

class DynamicMemoryLog 
{ 
public: 
    static DynamicMemoryLog* GetInstance(); 
private: 
    DynamicMemoryLog(); 
    static DynamicMemoryLog* m_pInstance; 
} 

DynamicMemoryLog* DynamicMemoryLog::GetInstance() 
{ 
    if(!m_pInstance)  
    { 
     m_pInstance = new DynamicMemoryLog();  
    }  

    return m_pInstance; 
} 
+0

GetInstance()が静的でない場合、私はこれを行うことができません... DynamicMemoryLog * dm = DynamicMemoryLog :: GetInstance(); ? – Sascha

+0

@Sascha静的メンバーメソッドは静的クラスの属性にしかアクセスできません。 –

+0

@Sascha通常、DynamicMemoryLog :: GetInstance()によって他のメンバーにアクセスします。 'DynamicMemoryLog :: GetInstance() - > AddIObject(...)' –

2

エラーは、静的メンバー関数を実装するときに静的キーワードを繰り返さないことです。これを修正すると、エラーが解決されます。

独立して、あなたのコードに少し奇妙なことがあります。このオブジェクトはシングルトンだと主張しますが、CreateLogを呼び出すたびにクラスの新しいインスタンスが作成されます。あなたは本当にこの振る舞いを望んでいますか、あるいはそこにたくさんのコピーがあるようにしたいですか?私は先に進む前にこれを調べることをお勧めします。あなたが任意の厄介なメモリ管理の問題を持っていません

class Singleton 
{ 
    public: 

     static Singleton* get() 
     { 
      static Singleton instance; 
      return &instance; 
     } 
}; 

この方法:

+0

ああ、静的関数を実装するときにbegininngにstaticを置かないでください。 Thx :) – Sascha

0

は、私は通常、このような何かを行います。

+0

その変数は、インスタンス全体にわたって永続的になり、範囲外になりますか? – Sascha

+0

@サスカ:永続的な*と*は範囲外になるとどういう意味ですか?変数 'instance'は' get() 'が初めて呼び出され、プログラムの終了時に破壊されたときに構築されます(あるいはクラスがライブラリ内にあるときに動的ライブラリアンロードされます)。 – Job

関連する問題