クラス内で作成したクラスへのアクセス方法

このQ&Aのポイント
  • C++のプログラミングにおいて、クラス内で作成した別のクラスへアクセスする方法について質問です。
  • 具体的には、Objectクラス内で作成したActionクラスのメンバにアクセスする方法を知りたいです。
  • メイン関数内でPlayer[1]->FireBall.Draw_Graph()としてもうまくいかず解決策を探しています。
回答を見る
  • ベストアンサー

クラス内で作成したクラスへのアクセス方法。

こんにちは、C++のプログラミングについて質問させて頂きます。 現在クラスを使って簡単なゲームを作ってみようと勉強中なのですが、クラスの扱いについて質問があります。 void Object::FireBall() {    //初期化の内容は読まなくても大丈夫です。 Action FireBall = Action(10,Ref_x() + cos(angle * PI / 180.0f)*3,Ref_y() + cos(angle * PI / 180.0f) *3 ,5,100,40,40,4,true,"Action/FireBall1.png",6,3,2,1.0,Ref_angle(),true,false); } といったように、Objectクラス内でActionクラスを作成したとします。 このとき、メイン関数内でFireBallの各メンバにはどうやってアクセスすれば良いのでしょうか? Objectクラスのオブジェクトの名前がPlayer[1]だとしたとき、 Player[1]->FireBall.Draw_Graph() のようにやるのかと思っていたのですが、上手くいかず、調べてもイマイチ解らず行き詰まっているのです(内部クラスとはまた別ですよね?)。 もし宜しければ、教えて頂けると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • tahke
  • ベストアンサー率33% (2/6)
回答No.1

ソースを見させて頂いている限り、 ActionオブジェクトのFireBallは、 FireBall関数ないのローカルオブジェクトのように見えます。 メンバ変数として宣言されておらず、 関数の中でのみ使用できるローカルオブジェクトとして宣言されているようにみえますので、 メンバとして宣言してください。

関連するQ&A

  • 画像をクラスにどうやって渡すべきかが解りません

    こんにちは、今回もC++のプログラミングについて質問させて頂きます。 現在勉強がてら作っている簡単なゲームで、処理を軽くするたびに画像ファイルを読み込む回数を減らそうとしています。、 プレイヤーのように最初から生成されているオブジェクトの場合はどうにか出来たのですが、プログラムの途中で生成するオブジェクトの場合、画像ファイルをどう読み込めば良いのか解らず困っています。 現在、炎の弾を作り出すメンバ関数 void Object::Shoot_FireBall(int Angle)//ファイアボール { FireBall* FireBall1 = new  FireBall(true,5,Ref_x(),Ref_y(),charge,"FIREBALL",Angle,5,0,40,40,4,true,Image_FireBall,1.0,true,true); if(Objects_Numbers>=Actions_Limit) { Objects_Numbers = Actions_Lower; delete Objects[Objects_Numbers]; } Objects[Objects_Numbers++] = FireBall1; } 上記のコードの FireBall(true,5,Ref_x(),Ref_y(),charge,"FIREBALL",Angle,5,0,40,40,4,true,Image_FireBall,1.0,true,true); の中の Image_FireBall をどこで定義すれば良いかが解らず困っています 以前までは void Player::Shoot_FireBall()//ファイアボール { FireBall* FireBall1 = new FireBall(5,Ref_x(),Ref_y(),charge,"FIREBALL",Ref_angle(),5,0,40,40,4,true,"Action/FireBall1.png",6,3,2,1.0,true,true); if(FIRE_num>=FIRE_Limit) FIRE_num = 1; FIRE_Array[FIRE_num++] = FireBall1; } といったように画像ファイルの名前を渡し、FireBallのコンストラクター内で画像を取得していたのですが、それでは処理が重くなると聞き、修正しようとしています。 最初は画像ファイルをメインループに入る前に読みこめば良いのかと思ったのですが、それでは有効範囲が違うので定義されていない識別子とコンパイラに認識され使用することが出来ません。 グローバル宣言を使えばなんとかなるとは思うのですが、グローバル宣言はあまり多用しない方が良いようなので、他の方法を考え現在はObjectクラスの基底クラスGraphの中で class Graph { public: protected: int *Image_FireBall; }; Graph::Graph(bool Sub_bShow,int sub_x,int sub_y,int XSize , int YSize, double Sub_ExtRate, double sub_Angle,int Sub_Trans_Flag,int Sub_Turn_Flag,int* sub_Image) { Image_FireBall = new int[6]; LoadDivGraph("Action/FireBall1.png", 6, 3 , 2 ,40 , 40 , Image_FireBall); } /* 関係の無いメンバやその初期化については省いて載せています */ のようにしていますが、コレでは結局FireBallオブジェクトが生成される度に読み込まれているので処理は変わらないと思い、他の方法を探している所です。 一体どうやって定義するのが良いのでしょうか、良い方法があれば教えて頂けると助かります、宜しくお願いします。

  • メンバ関数内でオブジェクトを作成する方法について

    こんばんは、C++のプログラミングについて質問させて頂きます。 現在、クラスを作って簡単なゲームプログラムを組んでいるのですが、メンバ関数内でクラスを宣言すると上手くオブジェクトを作成出来ないのです。 例えば、メンバ関数の外、メイン関数内で Player Player1 = Player(320,240,100,50,32,32,3,true,"Character/Character1_A.png"); PL_Array[1]=&Player1; FireBall FireBall1 = FireBall(PL_Array[1]->Ref_x(),PL_Array[1]->Ref_y(),PL_Array[1]->Ref_angle()); ACT_Array[1] = &FireBall1; とすると上手く動くのですが。 このPlayerクラスPlayer1のコンストラクター内で FireBall FireBall1 = FireBall(Ref_x(),Ref_y(),Ref_angle()); ACT_Array[1] = &FireBall1; とすると、FireBall1オブジェクトが生成されないのです。 この状態を改善するためにはどうすればいいのでしょうか、そもそもクラス内で他のクラスを作成する、といった動作自体があまり良く無いことなのでしょうか・・・ お時間がありましたら、お答え頂けると助かります、宜しくお願いします。

  • クラス内で、親ではない他のクラスへアクセスしたい。

    こんばんは、C++のプログラミングに関しての質問です。 現在、勉強がてら作っているゲームプログラミングで、躓いている部分があります。 現在、プレイヤーではないオブジェクトの描画を以下のソースコードで描画しています。 for(Check_OBJ=1;Check_OBJ<OBJ_num;Check_OBJ++) OBJ_Array[Check_OBJ]->Draw_Graph(PL_Array[1]->Ref_x(),PL_Array[1]->Ref_y()); OBJ_ArrayはObjectクラス、PL_ArrayはPlayerクラス、Ref_変数名 は変数名の値を返す関数です。 このソースコードを、Objectクラスのメンバ関数Action()の中に入れたいのですが、エラーが出てしまうのです、ソースコードは以下の通りです。 void Object::Action() { Draw_Graph(PL_Array[1]->Ref_x(),PL_Array[1]->Ref_y()); } エラー内容は error C2227: '->Ref_y' : 左側がクラス、構造体、共用体、ジェネリック型へのポインターではありません。 error C2027: 認識できない型 'Player' が使われています。 です。 Playerクラスが定義されてないと認識しているのかと思い、前方宣言もしてみたのですが改善できず、どうすれば良いのか解りません。 クラス内で他のクラスへアクセスするためには何か他の処理が必要なのでしょうか・・・? 解決方法をご存知の方がいたら教えて頂けると助かります、よろしくお願いします。

  • オブジェクトをどう更新するのが良いのか解りません。

    こんばんは、C++でのプログラミングについて質問させて頂きます。 現在DirectXライブラリを使って簡単なゲームを作っているのですが、ゲームのメインループの中で、各オブジェクトをどうやって更新するのが良いのかか解らず、アドバイスをもらえればと思い質問させて頂きました。 現在の更新方法は for(Check_Num=1;Check_Num<PL_Limit;Check_Num++) { PL_Array[Check_Num]->Action();//各オブジェクトを更新 OBJ_Array[Check_Num]->Action(); FIRE_Array[Check_Num]->Action(); } for(;Check_Num<OBJ_Limit;Check_Num++) { OBJ_Array[Check_Num]->Action(); FIRE_Array[Check_Num]->Action(); } for(;Check_Num<FIRE_Limit;Check_Num++) { FIRE_Array[Check_Num]->Action(); } Action関数には、表示を更新する、キー入力で移動する、接触したオブジェクトにダメージを与える、等といった各オブジェクトの動作が書かれています。 最初に定めたオブジェクトを生成できる上限の数まで、片っ端から全て更新していく、といった内容です。 また、オブジェクトの作成は void Player::Shoot_FireBall()//ファイアボール { FireBall* FireBall1 = new FireBall(5,Ref_x(),Ref_y(),charge,"FIREBALL",Ref_angle(),5,0,40,40,4,true,"Action/FireBall1.png",6,3,2,1.0,true,true); if(FIRE_num>=FIRE_Limit) FIRE_num = 1; FIRE_Array[FIRE_num++] = FireBall1; } といった関数を使い、特定のキーが入力された時に呼び出してオブジェクトを作成、上限に到達したら古いオブジェクトが入っていた配列を上書きして作る、といった内容です。 以上のようなソースコードを使ってやっていたのですが、このままオブジェクトの数(弾等の種類や敵の種類)が増えてくると、for文の中にその度に記述を追加していくとあまりにも長くなるような気がするのですが、この方法のままでやっていても大丈夫なのでしょうか・・? 後々効率が悪くなってくるような気がするのですが・・・、どうなのでしょうか、もし今の方法が悪いようでしたら、どう改善すれば良いのかを教えて頂ければと思います、宜しくお願いします。

  • C言語 DXライブラリ

    #include <math.h> #include "DxLib.h" #define PI 3.1415926f int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){ ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); int Handle[3]; LoadDivGraph( "画像/弾01.png", 3, 3, 1, 14, 16, Handle ); float x=320,y=240,angle=0,speed=1; while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){ x += cos( angle ) * speed; DrawRotaGraph( x, y, 1.0, angle+PI/2, Handle[0], TRUE ); } DxLib_End(); return 0; } これを実行すると画像が右に動いていくのですが、なぜ動くのかわかりません。 x += cos( angle ) * speed; の部分はx=320+0*1という事だと思っているのですが、これだとxはずっと320のままで画像が右に動いて行かないと思います。 教えてくださいm(_ _ )m

  • 直線と点の距離を使って当たり判定を作りたいのですが

    こんばんは、C++のゲームプログラミングで、当たり判定を作成しているのですが、どうしても上手くいかず、困っています。 エラー等ではなく、単純にどこが間違っているのか解らない、といった類の質問をするのはあまり良く無いのかもしれませんが、自分ではどうすればいいのか解らないので、ここで質問させて頂きます、よろしくお願いします。 作りたいのは、あるオブジェクトCの頂点の座標から直線の方程式、ax+by+cの、a,b,cを求め、接触しているからを確認したいオブジェクトTの頂点座標との距離を |ax0+by0+c|/√a*a+b*b の式を使って求めるプログラムです。 ソースコードは以下になります。 bool Object::Check_Collision2(Object Collision) { Sub_bShow(false);//自分自身には処理をしない。 point C[5]={0};//対象の頂点4つ、計算しやすいように配列は5つまで作ってある。 point T[4]={0};///呼び出し側のオブジェクトの頂点4つ double C_Distance = sqrtf((Collision.Ref_x_size()/2*Collision.Ref_x_size()/2)+(Collision.Ref_y_size()/2*Collision.Ref_y_size()/2));//中心から頂点までの距離を計算 double T_Distance = sqrtf((Ref_x_size()/2*Ref_x_size()/2)+(Ref_y_size()/2*Ref_y_size()/2)); for(int i=0;i<=3;i++) { //頂点の値を配列に代入 C[i].x = Collision.Ref_x() + cos((Ref_Angle()+45+(90*i)) * PI / 180.0f) *C_Distance; C[i].y = Collision.Ref_y() + sin((Ref_Angle()+45+(90*i)) * PI / 180.0f) *C_Distance; T[i].x = Ref_x() + cos((Ref_Angle()+45+(90*i)) * PI / 180.0f) *T_Distance; T[i].y = Ref_y() + sin((Ref_Angle()+45+(90*i)) * PI / 180.0f) *T_Distance; } C[4].x=C[0].x; C[4].y=C[0].y;//forで計算しやすいようにするための処理 //あとは二点間の直線の方程式 ax+by+cを求めて、点と直線の距離の公式で出来る・・・はず。 if(Collision.Ref_bShow()==true)//確認する対象は参照するべき相手かを確認 { if(Collision.Ref_Collision()==true)//当たり判定を有するか { for(int i=0;i<=3;i++) { for(int j=0;j<=3;j++) { double a =(C[i].y-C[i+1].y); double b =-(C[i].x-C[i+1].x); double c =( ((C[i].x-C[i+1].x)*C[i+1].y) - ((C[i].y-C[i+1].y)*C[i+1].x)); //呼び出したオブジェクトと引数のオブジェクトの接触を判定する if ( (fabs((a*T[j].x)+(b*T[j].y)+c) /hypot(a,b))<=10.0 ) { return(true); } } } return(false); } else { return(false); } } else { return(false); } } このソースコードで試してみたのですが、上手くいかず、数値を確認してみると、(fabs((a*T[j].x)+(b*T[j].y)+c) /hypot(a,b))の値がTの座標が違うところでこの関数を呼び出しても値が同じだったりと、おかしな結果になってしまいます(どうおかしい結果なのかも書くべきなのだとは思うのですが、法則性をまだ見つけられていないので・・・) もしどの部分が間違っているのかが解りそうでしたら、教えて頂けると助かります、数学的知識の勘違いや、単純なくだらないミスなのかもしれませんが、宜しくお願いします。

  • 他のクラスから呼び出した関数の戻り値がおかしい

    今、アクションゲームのようなものを作成しています。 このプログラムには Map_Draw クラスと Jchara クラスの二つのクラスが存在しており、 Map_Draw クラスには mapdata というプライベートな二次元配列が存在し、マップのデータを格納しています。 Map_Drawクラスにはmapdata の要素を参照するために、re_mapdata という関数があります。 このre_mapdata関数は、引数x,yをとり、mapdata[x][y]の値を返します。 ここで、Jcharaクラス内の関数からre_mapdata関数を呼び出したところ、 戻り値が滅茶苦茶な数字になり、正常に動作しません。 このre_mapdata関数は、Map_Drawクラスから呼び出すと正常に動作します。 なお、JcharaクラスにはMap_Drawクラスのオブジェクトjmdがあり、 jmd.re_mapdata という形で呼び出しています。 どなたか、回答をお願いします。 //re_mapdata関数のコード int re_mapdata(int x,int y){return mapdata[x][y];}

  • マウスーオーバーすると逃げるようにしたい!

    マウスオーバーするとランダムにアイコンが逃げるようにしたい。 触ろうとするとすっと逃げるようなアクションをしたいです。 一定の方向ではなくて、右へ左へはたまた上へという感じです。 on(rollOver) { angle = this._rotation-10; radian = (angle/180)*Math.PI; for (a=0; a<10; a++) { this._x -= 2*Math.cos(radian); this._y -= 2*Math.sin(radian); } } on (rollOut) { angle = this._rotation-10; radian = (angle/180)*Math.PI; for (a=0; a<20; a++) { this._x -= 1*Math.cos(radian); this._y -= 1*Math.sin(radian); } } 上記の場合だと一定の方向にマウスオーバーから逃げるのですが… これを色々な方向に生かせればなと思っております。 何卒よろしくお願いいたします。

  • このプログラムを実行すると座標列になるのですが、どうして実行結果のよう

    このプログラムを実行すると座標列になるのですが、どうして実行結果のような座標列になるのかがよくわかりません。 僕はdraw_polygon()中のif(r>xxx)の部分に何かあるような気がします。単なる推測ですが・・・。 理由を教えていただけませんか? #define _CRT_SECURE_NO_DEPRECATE 1 #include <stdio.h> #include <math.h> #defi ne PI 3.14159265358979323846 FILE *fp;//グローバル変数.あまり使うな! double get_x(double r, double angle); double get_y(double r, double angle); void draw_polygon(int n, double r, double cx, double cy); void main(void) { fp=fopen("polygon.csv","w");//チェック省略 draw_polygon(4,1,0,0); fclose(fp); } double get_x(double r, double angle) { return(r*cos(angle)); } double get_y(double r, double angle) { return(r*sin(angle)); } void draw_polygon(int n, double r, double cx, double cy) { int i; double delta,angle,x,y; delta=2.0*PI/n; for(i=0; i<=n; i++)//i<=n { angle=delta*i; x=get_x(r,angle)+cx; y=get_y(r,angle)+cy; fprintf(fp,"%8.3f,%8.3f\n",x,y); } fprintf(fp,"\n"); if(r>0.05) { for(i=0; i<=n; i++)//i<=n { angle=delta*i; x=get_x(r,angle)+cx; y=get_y(r,angle)+cy; draw_polygon(n,r*0.5,x,y); } } } プログラムを見やすく作ったのですが、この質問を掲示した途端に上下そろってしまいました(汗) 見にくくなってしまいすみません。

  • Viual C++ 2010 でエラー

    Visual C++ 2010で学習中の初心者です。 あるサイトにあったWindows Form用のサンプルプログラムを作ってビルドしようとしていますが、link error 1104 というのが出てうまくいきません。 フォーム上に三角関数の値を表示するという簡単なもので、最初にやった時にはできたのですが、表示の書式を少し変更してみたら、このエラーメッセージが出てきてどうしてもビルドできません。 参考にしているサイトは次のものです。 http://ishidate.my.coocan.jp/vcpp10_2/vcpp10_2.htm この中のForm1_Paint() 関数のコードをそのまま入力したのが以下のコードです。 private: System::Void Form1_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { Graphics^ g = e->Graphics; String^ string1; double radian; g->DrawString(" angle sin cos ", Font,                       Brushes::Black,10,20); g->DrawString("------------------------------ ------", Font, Brushes::Black, 10,35); for(int angle=0; angle<=90; angle += 10) { radian = angle*Math::PI/180.0; string1 = String::Format(" {0,3} {1,7:F7} {2,7:F7} ", angle, Math::Sin(radian), Math::Cos(radian)); g->DrawString(string1, Font, Brushes::Black, 10, 50+angle*2); } }// end function 最初に成功したときのフォームの出力の画面写真を添付してあります。 やりたかったことは String::Format() 関数の{ }の中の数字を変えて表示を確認したかっただけなのですが、このエラーはどうすれば修正できるのか、ご存知の方、どうぞよろしく教えてください。

専門家に質問してみよう