C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 一度だけ初期化するための書き方


(過去ログ 53 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■29366 / inTopicNo.1)  一度だけ初期化するための書き方
  
□投稿者/ 雲 (12回)-(2008/12/09(Tue) 06:12:03)

分類:[C/C++] 

こんにちは。
最近、GDII+ なるものを使う必要に迫られて、GDI+ の初期化で少し悩んでいます。

MSDN を見ると、GDI+ を使う前に、一度だけ、初期化関数を呼ぶ必要があると書いて
あるのですが、一度だけ初期化をすることを明確に記述する時には、どのように
書くのがわかりやすいのでしょうか?

今の自分の頭の中にあるのは、シングルトンパターンを援用して、以下のように
記述するのが良いのかな?と思っています。

////////////////////////////////////////////////////////////////////////////
// 定義
////////////////////////////////////////////////////////////////////////////
class GDIPlus{
public:
static GDIPlus& Init(){ static GDIPlus instance; return( instance ); }
~GDIPlus(){ GdiplusShutdown( gdiplus_token_ ); gdiplus_token_ = 0; }

private:
GDIPlus(){GdiplusStartup( &gdiplus_token_, &gdiplus_startup_input_, 0 ); }
GDIPlus( const GDIPlus & );

private:
static Gdiplus::GdiplusStartupInput gdiplus_startup_input_;
static ULONG_PTR gdiplus_token_;
};


Gdiplus::GdiplusStartupInput GDIPlus::gdiplus_startup_input_;
ULONG_PTR GDIPlus::gdiplus_token_ = NULL;
////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////
// 使い方
////////////////////////////////////////////////////////////////////////////
// GDI+ を使う前に、
GDIPlus &g = GDIPlus::Init();

という記述にするのが良いのかと思っています。
(一応、デストラクタも呼ばれるし。。。)

もし、イディオム的に使われている記述とか、より、明確な記述などありましたら、
教えていただけるとうれしいです。
引用返信 編集キー/
■29368 / inTopicNo.2)  Re[1]: 一度だけ初期化するための書き方
□投稿者/ たくボン (99回)-(2008/12/09(Tue) 08:16:29)
No29366 (雲 さん) に返信
> 今の自分の頭の中にあるのは、シングルトンパターンを援用して、以下のように
> 記述するのが良いのかな?と思っています。

基本的にsingletonで良いと思いますが、GDIを使うようなクラスならリソースの解放するタイミングに注意しないといけないかな。
GCの参照カウンタがなくなれば当然解放の対象になりますし、内部で使用するリソースの管理に注意すれば問題ないかと。
引用返信 編集キー/
■29390 / inTopicNo.3)  Re[2]: 一度だけ初期化するための書き方
□投稿者/ 774RR (254回)-(2008/12/09(Tue) 10:42:56)
C++ だし参照カウンタは無いと思う。

で、やりたいのは RAII であって、ソースコードでその表明をしたい、と。
C++ 経験者なら RAII は (そういう idiom であると知っていなくても) 理解できると思うので
グローバル変数でも十分だと思うな(生成消滅のタイミングがそれでOKなら)

シングルトンであることを明示すればよりよいわけだけど、そもそもシングルトンって
マルチタスク作業が始まった後で複数のタスク・スレッドから同時に実体生成しようとした場合に
1つしか実体が生成されないことを保証するためのものなのでオーバースペックかも。

ところでこの辺には
http://msdn.microsoft.com/en-us/library/ms534077(VS.85).aspx
一度だけしか呼んぢゃだめとは書かれていないのだが?
引用返信 編集キー/
■29459 / inTopicNo.4)  Re[3]: 一度だけ初期化するための書き方
□投稿者/ 雲 (13回)-(2008/12/10(Wed) 05:40:16)
> で、やりたいのは RAII であって、ソースコードでその表明をしたい、と。

はい。

> C++ 経験者なら RAII は (そういう idiom であると知っていなくても) 理解できると思うので
> グローバル変数でも十分だと思うな(生成消滅のタイミングがそれでOKなら)

なるほど。。。それは気がつきませんでした。

> ところでこの辺には
> http://msdn.microsoft.com/en-us/library/ms534077(VS.85).aspx
> 一度だけしか呼んぢゃだめとは書かれていないのだが?

確かに、そうなのですが、何度も呼ぶのは速度的にどうなのかな?と思ったのと、
一度しか呼べない時にはどうすれば良いのか?という意味でこんな書き方に
なってしまっていました(わかりにくくてごめんなさい)。

ただ、グローバル変数を使うのは、なかなか良いやり方だと思いますので、
その方向で考えてみようと思います。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -