Dxライブラリで使う画像を Image という名前空間にまとめるために次のように書きました。
Image.h
Image.cpp
こうすることで、 Image.h を include すれば Image::graphics にアクセスできるようになったのですが、 graphics の値が-1(読み込み失敗)になってしまいます。
名前空間に extern const int test を加え、 image.cpp で test = 5 とすると上手くいき、また WinMain 関数内で同じように graphics.png を読むのも上手くいきます。
const を外しても同じでした。
なぜ名前空間内では失敗するのですか?
namespace , extern , include について
Re: namespace , extern , include について
graphics変数をグローバル領域で初期化しようとしていますね。
グローバル領域での初期化はmain関数の実行より先に行われるため、DxLib_Init関数の実行よりも先にLoadGraphが実行されてエラーになっていると思います。
グローバル領域での初期化はmain関数の実行より先に行われるため、DxLib_Init関数の実行よりも先にLoadGraphが実行されてエラーになっていると思います。
-
shinpei
Re: namespace , extern , include について
なるほど…
load(){ Image::graphics = LoadGraph("graphics.png"); Image::test = LoadGraph("test.png"); ... }
というものを作り、DxLib_Init関数の実行後に呼ぶと読み込めました。
graphics や test を const にするにはどうすればよいのですか?
load(){ Image::graphics = LoadGraph("graphics.png"); Image::test = LoadGraph("test.png"); ... }
というものを作り、DxLib_Init関数の実行後に呼ぶと読み込めました。
graphics や test を const にするにはどうすればよいのですか?
Re: namespace , extern , include について
初期化タイミングを制御したい場合にconstは使えないので、関数を使用してアクセス制御をする方法があります。
namespace Image {
// ロード
extern void Load();
// 読み取り専用
extern int get_graphics();
extern int get_test();
}
Re: namespace , extern , include について
クラスを名前空間のように使う場合、これでは不十分です。
機能的にはクラスを使っても名前空間を使っても同じです。
ただ、画像データのロードや参照などの機能をこのようなモノステートパターンで実装するのは良い設計とは思えません。
DXライブラリの関数は実行出来るタイミングが限定されているので、グローバルスコープからどのタイミングでもアクセスできる設計になっているとバグの原因になると思います。
インスタンス生成を禁止するためにコンストラクタをprivateにしていますが、名前空間を使う場合よりも少し冗長になります。
機能的にはクラスを使っても名前空間を使っても同じです。
class Image{
private:
Image();
private:
static int graphics;
public:
static int get_graphics(){
return graphics;
}
}
DXライブラリの関数は実行出来るタイミングが限定されているので、グローバルスコープからどのタイミングでもアクセスできる設計になっているとバグの原因になると思います。