:.cppファイルで
Class LibExample {
public:
static LibExample* getInstance();
private:
class Helper {
public:
Helper() {
libExampleInstance = new LibExample();
}
~Helper() {
delete libExampleInstance;
}
LibExample* libExampleInstance;
};
static LibExample* m_instance;
LibExample();
virtual ~LibExample();
LibExample (const LibExample&) {};
LibExample& operator=(const LibExample&) {
return *(LibExample::getInstance());
}
};
。それはなぜ必要なのですか?
これはありません。 Helper
を使用してm_instance == NULL
のテストを許可し、最初にgetInstance
を使用するときはinit
を呼び出しますが、LibExample
コンストラクタでもinit
を実行している可能性があります。あいまいな理由があるかもしれませんが、IMHOではこのデザインはちょうど複雑すぎます。
あなたは持っている可能性があり:
Class LibExample {
public:
static LibExample* getInstance();
private:
LibExample();
virtual ~LibExample();
LibExample (const LibExample&) {};
LibExample& operator=(const LibExample&) {
return *(LibExample::getInstance());
}
};
LibExample* LibExample::getInstance() {
static LibExample instance;
static LibExample* p_instance = NULL;
if(p_instance == NULL) {
int ret = instance.init();
if(ret >= 0) {
p_instance = &instance;
}
}
return p_instance;
}
EDIT:コメントで@SingerOfTheFallで指摘したように
:私は、これはいくつかの種類を実装するために行われていると思います
後半の初期化:init()
が初めて失敗した場合、シングレットそれ自体は再構築する必要はなく、次にインスタンスが呼び出されるときに自身を再初期化しようとします。
まだHelper
は必要ありません。それに応じてコードを変更しました。
私は想像しています:失敗した 'init'が完了するたびにメモリを解放/再割り当てせずに、インスタンス' m_instance'をヌルにする能力を持つこと。私が理解できないのは、多形性を伴わないスタックの代わりにヒープ上にメモリを割り当てる理由です。 –
@ChrisR、 '私が理解できないのは、スタック上ではなくヒープ上にメモリを割り当てる理由です。私はこの特定のケースについてはわかりませんが、場合によっては(埋め込みで作業するとき)スタックのサイズが非常に大きく制限されていて、十分な大きさのオブジェクトのインスタンスが単純には収まらない場合があります。 – SingerOfTheFall