派生クラスのメンバ関数に処理がいかない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
かりんとう

派生クラスのメンバ関数に処理がいかない

#1

投稿記事 by かりんとう » 14年前

システムボタンを、作っているのですが、
ボタンを押した後の処理が思ったところに行きません。

以下 プログラムを簡略化しました。
読みづらかったらすいません。

このプログラムで「2」と表示させたいのですが、「1」と表示されます。
どうしてなのかわかりません。

助言をよろしくお願いいたします。

//a1クラス
//---------------------
class a1
{
   public:

   int b;
   a1();//コンストラクタ
   void a();//メンバ変数bの値を表示
};

a1::a1()//コンストラクタ
{
   b=1;//メンバ変数bに1を代入
}

void a1::a()//メンバ変数bの値を表示
{
   DrawFormatString(100, 100,GetColor(255,255,255), "%d" , b);
}
//---------------------


//a2クラス
//---------------------
class a2 : public a1//←a1を継承します
{
public:

int b;
a2();//コンストラクタ
void a();//メンバ変数bの値を表示
};

a2::a2()//コンストラクタ
{
b=2;//メンバ変数bに2を代入
}

void a2::a()//メンバ変数bの値を表示
{

DrawFormatString(100, 100,GetColor(255,255,255), "%d", b);
}
//-------------------

//aListクラス
//---------------------
class aList
{
public:

vector<a1>aList;//クラスa1のvectorクラスListを生成
aList();//コンストラクタ

};

aList::aList()
{
aList.resize(0);//aListのデータを0にする。

   {
a2 a2;//クラスa2のa2を生成。
aList.push_back(a2);//ここでaListにa2を登録します。
   }
}
//---------------------


//aListKanriクラス
//---------------------
class aListKanri
{
public:

aList *p_aList;//aListクラスのポインタ

void a3();//aListに登録されている最初のデータを表示する
};

void aListKanri::a3()//aListに登録されている最初のデータを表示する
{
p_aList->aList.at(0).a();
}
//---------------------------

int Key[256];

int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key==1) GetHitKeyStateAll_InputKey++;
else GetHitKeyStateAll_InputKey=0;
}
return 0;
}

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

//--- ▼ 前処理 ▼ ---


SetDrawScreen( DX_SCREEN_BACK );//描画先を裏画面に設定

aList aList;//aListクラス aListを生成
aListKanri aListKanri;//aListKanriクラス aListKanriを生成
aListKanri.p_aList = &aList;//aListKanriのメンバaListポインタに、aListのアドレスを代入


//--- ▲ 前処理 ▲ ---


while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0)
{
//↑メッセージ処理   ↑画面をクリア     ↑入力状態を保存       ↑ESCが押されていない

//--- ▼ ココから ▼ ---



aListKanri.a3();aListに登録されている最初のデータを表示する

ScreenFlip();//裏画面を表画面に反映


//--- ▲ ココまで ▲ ---
}

DxLib_End();
return 0;
}

アバター
うしお
記事: 56
登録日時: 14年前

Re: 派生クラスのメンバ関数に処理がいかない

#2

投稿記事 by うしお » 14年前

おそらくこのあたりが悩まれているところかなと思います。
ポリモーフィズムな振る舞いを期待するにはポインタか参照を用いるとうまくいくはずです。
テストコードを書いてみました。

コード:

#include <iostream>
#include <vector>
class Parent
{
public:
	virtual ~Parent(){}
	virtual void hoge()
	{
		std::cout << "Parent::hoge()" << std::endl;
	}
};
class Child : public Parent
{
	//オーバーライド
	virtual void hoge()
	{
		std::cout << "Child::hoge()" << std::endl;
	}
};
int main()
{
	{
		Parent parent = Child();//コピー
		parent.hoge();
	}
	{
		Parent* parent = new Child();//ポインタ
		parent->hoge();
		delete parent;
	}
	{
		Child child;
		Parent& parent = child;//参照
		parent.hoge();
	}
	{
		std::vector<Parent*> parentArray;
		parentArray.push_back(new Child());

		parentArray[0]->hoge();

		delete parentArray[0];
	}
	return 0;
}
実行結果です。
http://ideone.com/EhwHG
ご参考になれば幸いです。

かりんとう

Re: 派生クラスのメンバ関数に処理がいかない

#3

投稿記事 by かりんとう » 14年前

丁寧なアドバイスありがとうございました。
うしお様の返信をみて、40分悩んだ末やっとできました。
感謝です。
ここらでC++を本格的に基本から勉強しないといけないと痛感しました。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る