- ベストアンサー
C++のクラスポインタの初期化?
- C++のクラスポインタの初期化方法について質問です。
- 具体的には、Irrlichtでゲームを制作している際の初期化方法に関しての疑問です。
- 初歩的な質問ですが、アドレスを入れずにクラスポインタを関数で初期化する理由や、if文でのアドレス値の式の判別について教えていただきたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
若干語弊があるのですが。 C++のクラス、というのは、Cの構造体を拡張したものと考えてください。 > (1) *devide = createDevice( ...); createDeviceの宣言を見てないのですが、IrrlichtDevice へのポインタを返す関数になってませんか? Cでも struct A * foo(~) とかいう風に構造体(struct A)へのポインタを返す関数ってありますよね? > (2) if(!device) ポインタは NULL なら 「偽」、そうでないなら「真」です。 !は論理値の真偽を反転させます。 これはCでもよく使われる記法です。 例) FILE *fp = fopen(~); if (!fp){ /* → fp == NULL と同義 */ エラー; } > device だけならアドレスで、*device だとさしているオブジェクトそのものをあらわすと入門書には書いてある それは「IrrlichtDevice クラスへのポインタ」と宣言されているからです。 宣言(+初期化)と、それ以外での使い方が違うのはCも同じです。 struct A * a; は struct Aへのポインタ aの宣言 それ以降のプログラム中では a は struct Aへのポインタ *a は aの実体(=strcut Aそのもの) struct A b; では struct Aの変数 bの宣言 それ以降のプログラム中では b は struct A型の実体 *b は bがポインタでは無いのでエラー もし、Cの構造体やポインタについての理解が不十分なら、一度復習することをお勧めします。
その他の回答 (3)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> device だけならアドレスで、*device だとさしているオブジェクトそのものをあらわすと入門書には書いてあるのですが、(1)はアドレスを代入しているのでしょうか IrrlichtDevice *device; だろが IrrlichtDevice* device; だろが deviceの型は IrrlichtDevice* ですよ?
お礼
回答ありがとうございます。もういちどポインタを復習しようと思います。
- koko_u_u
- ベストアンサー率18% (216/1139)
> なぜクラスポインタが関数で初期化できるのですか。 関数の戻り値で初期化されているんですね。 > これだとアドレス値の式を判別しているように思いますが きっとリソースの確保に失敗などすると、0 が返ってくる仕様なんでしょうね。 リファレンスマニュアルなどを確認しながらチュートリアルを読みましょう。
お礼
回答ありがとうございます。 >きっとリソースの確保に失敗などすると、0 が返ってくる仕様なんでしょうね。 やっと意味がわかりました。そういうことだったのか~ >リファレンスマニュアルなどを確認しながらチュートリアルを読みましょう。 はい、もう一度しっかり読み直して見ます。
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
IrrlichtDevice *device; device = createDevice( video::EDT_SOFTWARE, ... だったら納得できます? 両者は同じですよ?
補足
device だけならアドレスで、*device だとさしているオブジェクトそのものをあらわすと入門書には書いてあるのですが、(1)はアドレスを代入しているのでしょうか
お礼
>createDeviceの宣言を見てないのですが、IrrlichtDevice へのポインタを返す関数になってませんか? なぞが解けました。ありがとうございます。戻り値がアドレスということでしょうか。 >ポインタは NULL なら 「偽」、そうでないなら「真」です。 !は論理値の真偽を反転させます。 これはCでもよく使われる記法です。 なんだかあほ丸出しで自分が恥ずかしい・・・とても勉強になりました。