8

現在、ファクトリをシングルトンとして実装しようとしています。シングルトン パターンの教科書の例を実際に使用しました。.h ファイルは次のとおりです。

namespace oxygen{

class ImpFactory{

public:
    static boost::shared_ptr<ImpFactory> GetInstance();

private:
    static boost::shared_ptr<ImpFactory> mInstance;
};

.cpp ファイルは次のとおりです。

#include "impfactory.h"

using namespace oxygen;
using namespace boost;

shared_ptr<ImpFactory> ImpFactory::GetInstance(){
    if (mInstance.get() == 0)
        mInstance = shared_ptr<ImpFactory>(new ImpFactory());
    return mInstance;
}

コードはコンパイルされますが、リンカー エラーが発生します。

../../lib/oxygen/liboxygen.so.3.2.4: `oxygen::ImpFactory::mInstance' への未定義の参照

これには現在、3人の学生が困惑しています。何か案は?

4

5 に答える 5

14

宣言するだけでなく、静的インスタンスを定義する必要があります。定義により、参照する実際のオブジェクトが作成されます。

cppファイルに次の行を追加します。

boost::shared_ptr<ImpFactory> ImpFactory::mInstance;
于 2010-01-27T08:19:01.257 に答える
2

cpp ファイルに静的メンバーの定義が必要です。

boost::shared_ptr<ImpFactory> ImpFactory::mInstance;
于 2010-01-27T08:19:37.417 に答える
2

あなたのC ++でこれを追加してください:

boost::shared_ptr<ImpFactory> ImpFactory::mInstance;
于 2010-01-27T08:19:40.413 に答える
0

別の補足として、インスタンスポインターをクラスではなく get 関数の静的メンバーにする必要があるかもしれませんが、これは new/pointer メソッドを使用する場合に大きな違いはありません。ただし、静的インスタンスを作成しただけの場合 (つまり、ポインターを使用せず、 get get 関数から参照を返す場合)、次の理由で大きな違いが生じます。

クラスの静的メンバーの場合、そのコンストラクターは常に呼び出されます (グローバルであるため) get 関数の静的メンバーの場合、最初に呼び出されるまで構築されません。これにより、人々が抱える問題の一部が軽減されます。シングルトンとそれらが美化されたグローバルである場合、もう1つの良い点は、ほとんどのリンカが get 関数を省略し、したがって呼び出されない場合は静的インスタンスを完全に省略するため、メモリのみを使用するように new を呼び出すことを心配する必要がないことです。使用されている場合。

于 2010-01-27T09:04:54.420 に答える
0

Boost を使用しているため、Boost シングルトン クラスを検討することをお勧めします。チェックアウト:

#include <boost/serialization/singleton.hpp>

using namespace boost::serialisation;

struct MyClass : public singleton<MyClass>
{ string name_; int age_; };

int main( int argc, char* argv[] )
{
    MyClass::get_mutable_instance().name_ = "Robin";
    MyClass::get_mutable_instance().age_ = 21;
}

どちらを使用するかは、何をしているかによって異なります。私は通常の理由からシングルトンには少し反対ですが、可能な限り再利用することは理にかなっています。ただし、警告の言葉: Boost シングルトンはライブラリ内で少し移動したように見えるため、使用している Boost のバージョンによって異なる場合があります。

于 2010-01-27T10:20:35.273 に答える