お邪魔します。
前回の続きになってしまいますが。。前スレは以下のアドレスです
http://www.play21.jp/board/formz.cgi?ac ... 5185#45185
前回解決と(決め打ち)し、今まで放置してましたが、
最近、このプロジェクトを見直ししていて、
確実にシングルトン化出来ていないことが判明し、
修正方向を教えていただきたいです。
やりたい事は前スレに書いてありますが、再度書きます。
今回添付したfirst.txtのシングルトンクラスの
GetInstance
DeleteInstance
Order
を何とかテンプレート化したく、あがいた結果、
ぽこさんや他の皆様の助言もあり、second.txtとなりました。
が、全く万事解決しておらず、子クラスのインスタンスが普通に生成出来てしまっています。
子クラスのコンストラクタをプライベートにしなければならないのですが、
そうすると、親クラスで動的生成が出来なくなってしまいます。
どう修正していったらよいでしょうか?
最終的には
子クラス::GetInstance()
子クラス::Order()->子クラス関数
子クラス::DeleteInstance()
のみ実行できるようにしたいです。()
よろしくお願いします。
シングルトンクラスのテンプレート化 続
Re: シングルトンクラスのテンプレート化 続
すでに質問に漏れが・・・
second.txt
×static bool GetInstance(int t=0)
○static bool GetInstance()
second.txt
×static bool GetInstance(int t=0)
○static bool GetInstance()

Re: シングルトンクラスのテンプレート化 続
>子クラスのコンストラクタをプライベートにしなければならないのですが、
>そうすると、親クラスで動的生成が出来なくなってしまいます
・ 子クラスのコンストラクタ・デストラクタを privateに。
・ superクラスに typedef super<T> super_type; を追加。
・ subA / subBクラスに friend super_type; を追加。
とりあえずこれで動的生成はできるようになると思います。
>そうすると、親クラスで動的生成が出来なくなってしまいます
・ 子クラスのコンストラクタ・デストラクタを privateに。
・ superクラスに typedef super<T> super_type; を追加。
・ subA / subBクラスに friend super_type; を追加。
とりあえずこれで動的生成はできるようになると思います。
Re: シングルトンクラスのテンプレート化 続
>子クラスのインスタンスが普通に生成出来てしまっています。
こういう事を防ぐために、前回提示したソースではクラスsuperのコンストラクタに
アサーションが入っているのですが、これを外した理由は何でしょうか?
こういう事を防ぐために、前回提示したソースではクラスsuperのコンストラクタに
アサーションが入っているのですが、これを外した理由は何でしょうか?
Re: シングルトンクラスのテンプレート化 続
返事が遅れて申し訳ありませんでした。
> Justyさん
すばらしいです。
friendの存在すら忘れていました。
やらないとすぐに忘れてしまいますね。
Justyさんのおっしゃる通りにすることで、実現できました。
> ぽこさん
> アサーションが入っているのですが、これを外した理由は何でしょうか?
ここは書いていなかったのですが、
自分の想定している範囲では、
インスタンス生成自体出来ない→コンパイルが通らず、errorが出る
でした。assertでは実現できてしまいます。(コンパイル自体可能)
また、正直、assertはプログラムに組み込んだ経験が少なく、
その効用を十分に把握しておらず、使う事に抵抗があったため、
勝手に削除していました。
ぽこさんのご回答を無視する形になってしまい、大変申し訳ありませんでした。
しかし、assertの用法の見直しになり、大変参考になりました。
ありがとうございました。
短かったですが、質問は解決しましたので、解決にさせていただきます。
ご回答ありがとうございました。
次回もよろしくお願いします。
> Justyさん
すばらしいです。
friendの存在すら忘れていました。
やらないとすぐに忘れてしまいますね。
Justyさんのおっしゃる通りにすることで、実現できました。
> ぽこさん
> アサーションが入っているのですが、これを外した理由は何でしょうか?
ここは書いていなかったのですが、
自分の想定している範囲では、
インスタンス生成自体出来ない→コンパイルが通らず、errorが出る
でした。assertでは実現できてしまいます。(コンパイル自体可能)
また、正直、assertはプログラムに組み込んだ経験が少なく、
その効用を十分に把握しておらず、使う事に抵抗があったため、
勝手に削除していました。
ぽこさんのご回答を無視する形になってしまい、大変申し訳ありませんでした。
しかし、assertの用法の見直しになり、大変参考になりました。
ありがとうございました。
短かったですが、質問は解決しましたので、解決にさせていただきます。
ご回答ありがとうございました。
次回もよろしくお願いします。