シングルトンクラスのテンプレート化 続

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kazuoni

シングルトンクラスのテンプレート化 続

#1

投稿記事 by kazuoni » 15年前

お邪魔します。
前回の続きになってしまいますが。。前スレは以下のアドレスです

http://www.play21.jp/board/formz.cgi?ac ... 5185#45185

前回解決と(決め打ち)し、今まで放置してましたが、
最近、このプロジェクトを見直ししていて、
確実にシングルトン化出来ていないことが判明し、
修正方向を教えていただきたいです。

やりたい事は前スレに書いてありますが、再度書きます。
今回添付したfirst.txtのシングルトンクラスの
GetInstance
DeleteInstance
Order
を何とかテンプレート化したく、あがいた結果、
ぽこさんや他の皆様の助言もあり、second.txtとなりました。
が、全く万事解決しておらず、子クラスのインスタンスが普通に生成出来てしまっています。
子クラスのコンストラクタをプライベートにしなければならないのですが、
そうすると、親クラスで動的生成が出来なくなってしまいます。
どう修正していったらよいでしょうか?

最終的には
子クラス::GetInstance()
子クラス::Order()->子クラス関数
子クラス::DeleteInstance()
のみ実行できるようにしたいです。()

よろしくお願いします。

kazuoni

Re: シングルトンクラスのテンプレート化 続

#2

投稿記事 by kazuoni » 15年前

すでに質問に漏れが・・・

second.txt

×static bool GetInstance(int t=0)
○static bool GetInstance() 画像

Justy

Re: シングルトンクラスのテンプレート化 続

#3

投稿記事 by Justy » 15年前

>子クラスのコンストラクタをプライベートにしなければならないのですが、
>そうすると、親クラスで動的生成が出来なくなってしまいます

・ 子クラスのコンストラクタ・デストラクタを privateに。
・ superクラスに typedef super<T> super_type; を追加。
・ subA / subBクラスに friend super_type; を追加。

 とりあえずこれで動的生成はできるようになると思います。

Poco

Re: シングルトンクラスのテンプレート化 続

#4

投稿記事 by Poco » 15年前

>子クラスのインスタンスが普通に生成出来てしまっています。

こういう事を防ぐために、前回提示したソースではクラスsuperのコンストラクタに
アサーションが入っているのですが、これを外した理由は何でしょうか?

kazuoni

Re: シングルトンクラスのテンプレート化 続

#5

投稿記事 by kazuoni » 15年前

返事が遅れて申し訳ありませんでした。

> Justyさん

すばらしいです。
friendの存在すら忘れていました。
やらないとすぐに忘れてしまいますね。
Justyさんのおっしゃる通りにすることで、実現できました。


> ぽこさん
> アサーションが入っているのですが、これを外した理由は何でしょうか?

ここは書いていなかったのですが、
自分の想定している範囲では、
インスタンス生成自体出来ない→コンパイルが通らず、errorが出る
でした。assertでは実現できてしまいます。(コンパイル自体可能)
また、正直、assertはプログラムに組み込んだ経験が少なく、
その効用を十分に把握しておらず、使う事に抵抗があったため、
勝手に削除していました。
ぽこさんのご回答を無視する形になってしまい、大変申し訳ありませんでした。
しかし、assertの用法の見直しになり、大変参考になりました。
ありがとうございました。


短かったですが、質問は解決しましたので、解決にさせていただきます。
ご回答ありがとうございました。
次回もよろしくお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る