人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

[C++] Singletonでコンストラクタに引数を使う場合

Singletonでコンストラクタに引数を使う必要がある場合に、シンプルに書く方法を探しています。

初期化とインスタンス取得のメソッドを分けて、初期化する可能性がある所から読む場合は必ず初期化を試してから取得、という方法しか思いついていません。
この方法だと呼び出し元が必ず初期化引数を持っているわけではないので呼び出し方が統一できず、今後破綻するように思われます。

TEST->initialize(param)
TEST->getInstance()

使用前に強制的に初期化できるようアプリケーションを変えてしまうのも手ですが、将来のアプリケーションの設計変更への準備を兼ねていることもあり難しい状況です。

よろしくお願い致します。

●質問者: kyo_bracer
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

質問者から

補足です。

1.初期化されていない時点で初期化不可能な場所から呼ばれるケースは(コードでは)現状無視するか例外で結構です。
2.一度初期化されている場合は変数が異なっていても追加の初期化指示は無視してかまいません。
3.> そもそもの設計がダメな気がしています。
回答しやすくなるかと思い書いた条件が裏目に出ているかもしれません。
質問の主旨は、引数つきで生成するインスタンスをシングルトンで扱いたい場合、なにかパターンのようなものがあるかどうか知りたい、というものでした。
特に、インスタンス取得と初期化を同じ入口で行う方法があるか、分けなければいけないとしても綺麗な実装方法はあるか、というのが主に知りたい部分です。
なので上の条件は一部無視してでも一般的な情報があればそれは助かります。(具体的な問題を解決するデザインパターンにこだわっているわけではありません)

質問が解りづらくて申し訳ありません。

よろしくお願い致します。


1 ● a-kuma3
●100ポイント ベストアンサー

面白そうなので、ちょっと考えてみました。
こんな感じで、どうでしょう?

class TestSingleton {
public:
 static TestSingleton* getInstance(const Parameter* param) {
 if (instance_ == not_initialized_) {
 if (param != NULL) {
 instance_ = new TestSingleton(param);
 }
 }
 return instance_;
 }
 
 virtual void method1() {
 ...
 }

private:
 TestSingleton(const Parameter* param) {
 ...
 }
 TestSingleton() {}

private:
 static TestSingleton* instance_;
 static TestSingleton* not_initialized_;

 // 初期化されていないインスタンス用のクラス
 class NotInitialized : public TestSingleton {
 // 全てのメソッドで、例外を送出する
 virtual void method1() {
 throw NotInitializedException();
 }
 };
};

TestSingleton* TestSingleton::not_initialized_ = new TestSingleton::NotInitialized();
TestSingleton* TestSingleton::instance_ = not_initialized_;

同期とか、コピーコンストラクタとか、その辺りの Singleton のテンプレートは割愛してます。
スコープもちょっと怪しいけど、大目に見てください。

んで、使う側はこう。

// 初期化できる人
Parameter param = ...
TestSingleton s = TestSingleton::getInstance(&param);


// 初期化できない人
TestSingleton s = TestSingleton::getInstance(NULL);

たたき台にでもなれば。
# 叩くときは、優しくお願いします :-)

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ