コンストラクタでのオブジェクト生成(C++6.0,DirectX9)

解決


moka  2006-03-27 17:25:01  No: 61045  IP: 192.*.*.*

C++6.0でDirectX9のフォント表示機能をまとめた自作クラスを作りたいのですが
D3DXCreateFontでオブジェクトを作成する工程を、自作クラスのコンストラクタで
済ませてしまいたいと思ったのですが上手く行きません。

メンバ関数としてD3DXCreateFontを行った場合は成功するのですが
何故コンストラクタで行うとエラーとなるのかが分かりません。

原因と対処方法の分かる方居られましたらご教授お願い致します。

以下コードです。(一部割愛

// クラスの宣言(h
class cMsgCls {
public:
  cMsgCls();            // コンストラクタ
  void cMsgCls_Init();  // 同じ内容のメンバ関数

protected:
  // メンバ変数
  LPD3DXFONT  FontObj;    // 対象オブジェクト
};


// コンストラクタ(cpp
cMsgCls::cMsgCls() {
  HRESULT hr;

  hr = D3DXCreateFont(
    lpD3ddev,      // LPDIRECT3DDEVICE9
    24, NULL, FW_DONTCARE, NULL, FALSE, SHIFTJIS_CHARSET,
    OUT_DEFAULT_PRECIS, DEFAULT_QUALITY,
    DEFAULT_PITCH | FF_DONTCARE, "MS ゴシック",
    &FontObj      // 対象オブジェクト
  );

  // エラー判定
  if (FAILED(hr)) {
    // ここで(D3DXERR_INVALIDDATA:データが無効)が帰って来る。
  } 
}

// 上記のコンストラクタと同じ内容のメンバ関数
void cMsgCls::cMsgCls_Init() {
  // コンストラクタと同じ内容
}

cMsgCls cMsgClsObj;  と、宣言するとコンストラクタでエラー。
コンストラクタの内容をコメントアウトして
cMsgCls.cMsgCls_Init();  を行うと成功。

編集 削除
Ban  2006-03-27 17:37:19  No: 61046  IP: 192.*.*.*

> cMsgCls cMsgClsObj;  と、宣言するとコンストラクタでエラー。
> コンストラクタの内容をコメントアウトして
> cMsgCls.cMsgCls_Init();  を行うと成功。

確認ですが、上記を同じ場所に書いてますか?

cMsgCls cMsgClsObj; と、
cMsgCls cMsgClsObj; cMsgCls.cMsgCls_Init(); ?

コンストラクタの方は事前に別の場所で走っていて、そのタイミングではまだ
Dx の初期化がすんでないとか、そういうことはありませんか。

編集 削除
moka  2006-03-27 18:05:31  No: 61047  IP: 192.*.*.*

早速のお返事有難う御座います。

cMsgCls cMsgClsObj; は、
ウィンドウが生成された後にグローバル宣言しています。
cMsgCls.cMsgCls_Init(); は、
メインループ内で常にFPSを表示しているのですが、
その初めの一回で呼んでいます。

DirectXの初期化はウィンドウ生成時に行い、クラスとは無関係の
別のフォントオブジェクトは同じタイミングで使用できていますので
初期化済みだと思います。

コンストラクタをコメントアウトせずにエラーを出しその後も処理を
継続する様にした所、正常にオブジェクト作成できました。

編集 削除
moka  2006-03-27 18:19:47  No: 61048  IP: 192.*.*.*

申し訳ありません。

ご指摘頂いた通り、DirectX初期化前にコンストラクタが走っていました。
ご指摘いただいてから返信を返す過程でコードを見直していたのですが、
DirectXの初期化のタイミングを生成時に行う方法から
自分で関数を呼んで行う方法に変え、コメントアウトされているのに
返信した後で気づきました。

自分の不注意で起こっていたエラーに気づけず、お騒がせ致しました。
それに気づけたのもご指摘頂いけたおかげです。
ご返信有難うございました。

編集 削除