Re: フォントをstaticメンバーで作成するには ( No.1 ) |
- 名前:寝狐 日時:2008/09/09 03:00
申し訳ありません。
上のstaticメンバーで上手くいかないというのは解決できました。
宣言の際にstaticメンバーをstaticメンバー(ここではCreateFontToHandle)で初期化すると、どちらの宣言が先か分からないということで出来ないのですね。
そうすると、フォントを作成する関数を作っておいてループの前辺りで最初に使っておけば大丈夫そうです。
参考ページ:
ttp://www.geocities.jp/ky_webid/cpp/language/019.html
ですので、変数を直接入力して(GetColor(255,255,255)だと返り値が-1なので、これを使わずに直接色のパラメーターに-1を入力する、等)が可能なのかだけよろしくお願いします。
|
Re: フォントをstaticメンバーで作成するには ( No.2 ) |
- 名前:通 日時:2008/09/09 09:56
>宣言の際にstaticメンバーをstaticメンバー
>(ここではCreateFontToHandle)で初期化すると、
>どちらの宣言が先か分からないということで
>出来ないのですね
言っていることがよくわかりませんが、
質問を見る限り、CreateFontToHandleは
関数なのでスコープ的に、スタティックメンバで
あるfont_LLに対する初期化で呼び出せない
だけでしょう。
#関数の外で関数を呼び出そうとしている分けですから
そのような初期化は普通コンストラクタで
行うと思いますが。。。?
|
Re: フォントをstaticメンバーで作成するには ( No.3 ) |
- 名前:GPGA 日時:2008/09/09 15:38
これは、Dx_Init関数の前にCreateFontToHandle関数を
呼び出しているから、成功しないだけだと思いますよ。
>通さん
関数外からでも関数は呼べます。
#include <stdio.h>
int n = printf("あいうえお");
int main() {
return 0;
}
|
Re: フォントをstaticメンバーで作成するには ( No.4 ) |
- 名前:寝狐 日時:2008/09/09 15:42
>そのような初期化は普通コンストラクタで
>行うと思いますが。。。?
staticでないメンバーも含むクラスなら、インスタンスを生成する際に
コンストラクタを用いて初期化してもいいのですが
出来れば、メンバー全てをstaticにしたクラスにしたいので…
初期化のためにインスタンスを作るのもありですかね?
GlobalUse.hのなかにenumやtypedef、stataicメンバーでのコードの変換などをまとめて、
このヘッダーを読み込むだけでこれらを全部使えるようにしたいのです。
なので、もし色コードやフォントが環境に依存しないなら
GetColorやCreateFontToHandleを用いないで直接コードを渡したほうが効率がいいかなぁと
|
Re: フォントをstaticメンバーで作成するには ( No.5 ) |
- 名前:GPGA 日時:2008/09/09 15:47
あれ、通さんに的外れなこと言ってるかな?
ただ、static変数の初期化方法は寝狐さんの
やり方で問題ないと思います。
#include <stdio.h>
class A {
public :
static int N;
};
int A::N = printf("あいうえお\n");
int main() {
printf("N=%d\n", A::N);
return 0;
}
|
Re: フォントをstaticメンバーで作成するには ( No.6 ) |
- 名前:寝狐 日時:2008/09/09 15:55
>これは、Dx_Init関数の前にCreateFontToHandle関数を
>呼び出しているから、成功しないだけだと思いますよ。
なるほど…確かにDXライブラリの初期化ができていない状態じゃ成功しないのは当たり前ですね
初期化後に呼び出すのだと
1.初期化用の関数を用意する(これでとりあえず成功しました)
2.インスタンスを作る(コンストラクタを呼び出す)
3.他のインスタンスが作られるクラスのメンバーにする
のどれかしか無さそうですね。
|
Re: フォントをstaticメンバーで作成するには ( No.7 ) |
- 名前:GPGA 日時:2008/09/09 16:19
シングルトンパターンを使ってみてはいかがでしょう。
シングルトンパターンはそのプログラム内で、実態が一つであることが保障されます。
寝狐さんのGlobalUseクラスは、複数のインスタンスを作ろうと思えば作れますが
シングルトンパターンを使用した場合、インスタンスは一つしか作ることができません。
詳しくはこちら
ttp://www.geocities.jp/bleis_tift/cpp/singleton.html
また、シングルトンパターンの初期化は、シングルトンパターン化したクラスのメンバ関数を
呼び出した最初に行われるため、DxLib_Initの後にgetSystemFontを呼び出すことさえ保証すれば
特に、初期化関数を用意する必要もありません。
以下はシングルトンパターン化したプログラムの例です。
class GlobalUse {
public :
enum FONT {
SS, //最小
S, //小
M, //中
L, //大
LL //最大
};
int getSystemFont(FONT font) {
switch(font){
case SS: return font_SS;
case S: return font_S;
case M: return font_M;
case L: return font_L;
case LL: return font_LL;
default: return font_M;
}
}
static GlobalUse* Get() {
static GlobalUse gu;
return &gu;
}
private :
// コンストラクタ
GlobalUse() {
font_SS = CreateFontToHandle(NULL,10,1,DX_FONTTYPE_ANTIALIASING);
font_S = CreateFontToHandle(NULL,20,3,DX_FONTTYPE_ANTIALIASING);
font_M = CreateFontToHandle(NULL,30,5,DX_FONTTYPE_ANTIALIASING);
font_L = CreateFontToHandle(NULL,40,7,DX_FONTTYPE_ANTIALIASING);
font_LL = CreateFontToHandle(NULL,50,9,DX_FONTTYPE_ANTIALIASING);
}
GlobalUse(cosnt GlobalUse&);
// デストラクタ
~GlobalUse(){}
int font_SS;
int font_S;
int font_M;
int font_L;
int font_LL;
};
// 使用方法
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
DxLib_Init();
int fontM = GlobalUse::Get()->getSystemFont(GlobalUse::M); // ←初めてGet関数が呼ばれたときに初期化される
int fontL = GlobalUse::Get()->getSystemFont(GlobalUse::L); // ←2回目以降の呼び出しは、初期化が呼ばれない
DxLib_End()
}
|
Re: フォントをstaticメンバーで作成するには ( No.8 ) |
- 名前:通 日時:2008/09/09 16:32
> 通さんに的外れなこと言ってるかな?
失礼。DXライブラリの関数ですね;
CreateFontToHandleをメンバと勘違いしてたorz
しかも書き間違い。
×関数の外で関数を呼び出そうとしている
○クラスの外で関数を呼び出そうとしている
#まぁスコープつければいいんですが
勘違いなんで、こっちの発言は放置してください;
静的メンバの初期化は実行時最初に行われるので
Dx_Init関数の前の呼び出しが原因で失敗は確実ですね
で少し思ったのですが、
これってstaticにする理由は有るのでしょうか?
コンストラクタで作ってデストラクタで破棄じゃ
だめなの?
#DXライブラリの初期化後に
#インスタンスを作るならですが。
> 1.初期化用の関数を用意する
これやるなら別に意味がナイトおもうのだが。。
|
Re: フォントをstaticメンバーで作成するには ( No.9 ) |
- 名前:寝狐 日時:2008/09/09 16:31
>GPGAさん
確か、デザインパターンというものでしたか…
いまいち使い方が分からなくてちゃんと勉強していませんでしたが
こういう場面に使えるものだったのですね…勉強になりました
勉強もかねて、このパターンを利用してみたいと思います。
大変詳しく教えてもらい、ありがとうございました。
|
Re: フォントをstaticメンバーで作成するには ( No.10 ) |
- 名前:通 日時:2008/09/09 17:01
レスしたらGPGA さんのレスが。
とても分かりやすい構造ですね。
細かいけど。。。
×cosnt
○const
このしたのコメント削除。
#また勘違いだったので。。。よく見ろ私。
|
Re: フォントをstaticメンバーで作成するには ( No.11 ) |
- 名前:寝狐 日時:2008/09/09 16:57
>通さん
staticにしたのは、includeしただけで簡単に呼び出せるようにするためです
普通にインスタンスをつくる方法だと
他のインスタンスでこれらの関数を利用するのに
引数でGlobalUseの参照なりポインタを渡さないといけないので少し分かりづらくなるかなぁと
なのでインスタンスは極力作りたくなかったですし
他のクラスに取り込むというのも、全体で使う関数をまとめて分かりやすくするという意味では×
出来ればヘッダーだけで完結させておきたかったので関数を使うのも苦肉の策です。
staticを用い過ぎるとファイルが重くなる(動作はどうなんでしょ)のは知っていましたが
グループで作成するつもりだったので(3人で、私以外は完全に未経験者)
感覚的に使いやすいものにしておきたかったのです
|
Re: フォントをstaticメンバーで作成するには ( No.12 ) |
- 名前:通 日時:2008/09/09 17:14
>引数でGlobalUseの参照なりポインタを
>渡さないといけないので少し分かりづらくなる
なるほど。
複数つくられるという懸念を置いておけば、
グローバルにクラスを持ってくることも可能です。
で、初期化用メソッドをDXINITの後に呼ぶとか。
#ほめられた方法ではないですが。
ここはやはり既に出ている通り、
DXライブラリの初期化後の使用を前提に、
シングルトンクラスがいいでしょうね。
#もしくはDXINITもグローバル内に入れて
#そこで一度だけ行うとかでもありかも。
> (動作はどうなんでしょ)
実行時に動的に確保される物よりは、
幾分か早いと思います。
|