ページ 1 / 1
関数のオーバーライドがされていない。(初学者)
Posted: 2017年4月26日(水) 20:12
by keito94
関数のオーバーライドと言うものを利用して、何かのプログラムを作ろうとしているのですが、
どういうわけか関数のオーバーライドがされず、黒い画面のみが表示されるのみです。
関数がオーバーライドされない原因はどこにありますか?
メインプログラムの宣言
コード:
virtual void Move() {}
virtual void Draw() {}
メインプログラム
コード:
void CGameMain::Run() {
Move();
Draw();
}
オーバーライドされる部分の宣言
コード:
virtual bool Move();
virtual void Draw();
オーバーライドされる部分
コード:
bool CPlayer::Move() {
JoyPad.Update();
if (JoyPad.Get(PAD_INPUT_LEFT)) {
VX = -3.0F;
Dir = 1;
}
else if (JoyPad.Get(PAD_INPUT_RIGHT)) {
VX = 3.0F;
Dir = 0;
}
else {
VX = 0;
}
return true;
}
void CPlayer::Draw() {
DrawRotaGraphF(X, Y, 1.0, 0, Game->PlayerGh[0], TRUE, Dir);
}
Re: 関数のオーバーライドがされていない。(初学者)
Posted: 2017年4月26日(水) 20:21
by Dixq (管理人)
提示されているプログラムの抜粋が良くないです。
どこが親クラスなのかどこが子クラスなのかどこに継承しているのかが良く分かりません。
オーバーライド先にはvirtuslではなくoverride修飾子を使いますし、
メインプログラムが継承元のように見えますが、そこから派生するのもおかしいです。
全体を見せてください。
Re: 関数のオーバーライドがされていない。(初学者)
Posted: 2017年4月27日(木) 15:00
by keito94
>>DIXQさん
わかりました。
ソースコード全体を掲示します。
Joypad.h
コード:
#pragma once
class CJoyPad {
public:
int Input, EdgeInput;
void Update();
int Get(int JoyPadCode);
};
JoyPad.cpp
コード:
#include "Main.h"
#include "JoyPad.h"
void CJoyPad::Update() {
int i;
i = GetJoypadInputState(DX_INPUT_KEY_PAD1);
EdgeInput = i & ~Input;
Input = i;
}
int CJoyPad::Get(int JoyPadCode) {
return Input&JoyPadCode;
}
Player.h
コード:
#pragma once
#include "Mover.h"
class CPlayer : public CMover {
int Dir;
public:
CPlayer(float x, float y);
virtual bool Move();
virtual void Draw();
};
Player.cpp
コード:
#include "Main.h"
#include "Player.h"
#include "JoyPad.h"
CJoyPad JoyPad;
CPlayer::CPlayer(float x, float y)
:CMover(x, y, -8, -8, 8, 8),Dir(0) {
}
bool CPlayer::Move() {
JoyPad.Update();
if (JoyPad.Get(PAD_INPUT_LEFT)) {
VX = -3.0F;
Dir = 1;
}
else if (JoyPad.Get(PAD_INPUT_RIGHT)) {
VX = 3.0F;
Dir = 0;
}
else {
VX = 0;
}
return true;
}
void CPlayer::Draw() {
DrawRotaGraphF(X, Y, 1.0, 0, Game->PlayerGh[0], TRUE, Dir);
}
Mover.h
コード:
#pragma once
class CMover {
public:
float X, Y, L, T, R, B;
float VX, VY;
CMover(float x, float y);
CMover(float x, float y, float l, float t, float r, float b);
bool Hit(CMover* m);
};
Mover.cpp
コード:
#include "Mover.h"
CMover::CMover(float x, float y)
:X(x), Y(y) {
}
CMover::CMover(float x, float y, float l, float t, float r, float b)
:X(x), Y(y), L(l), T(t), R(r), B(b), VX(0.0F), VY(0.0F) {
}
bool CMover::Hit(CMover* m) {
return X + L < m->X + m->R&& m->X + m->L < X + R&&Y + T < m->Y + m->B&&m->Y + m->T < Y + B;
}
Re: 関数のオーバーライドがされていない。(初学者)
Posted: 2017年4月27日(木) 16:11
by purin52002
管理人さんの言う通りvirtualのつけ方を間違ていると思います。
コード:
class Super
{
public:
virtual void func();//ベースクラスでvirtual
};
class Sub : public Super
{
public:
void func() override;//派生クラスでoverrideと書いておくと仮想関数がなかった場合にエラーを出してくれる
};
派生クラスのCPlayerにvirtualがついているので、CMoverにつけてあげてください。
Re: 関数のオーバーライドがされていない。(初学者)
Posted: 2017年4月27日(木) 16:38
by keito94
virtualをCMoverにつけてあげたのですが、プログラムの画像が表示されません。
メインプログラムのコードをあげます。どこかおかしな点はありますか?
Main.h
コード:
#pragma once
#include "DxLib.h"
class CGameMain {
public:
int PlayerGh[32];
CGameMain();
~CGameMain();
void FirstInit();
void Run();
virtual void Move() {}
virtual void Draw() {}
};
extern CGameMain* Game;
Main.cpp
コード:
//デバッグのトレーニングついでに作り直す。
#include "Main.h"
#include "Player.h"
CGameMain* Game;
CGameMain::CGameMain() {
ChangeWindowMode(TRUE); SetGraphMode(320, 240, 32), SetUseCharSet(DX_CHARSET_UTF8);
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
LoadDivGraph("自作キャラ.bmp", 32, 8, 4, 16, 16, PlayerGh);
}
CGameMain::~CGameMain(){
DxLib_End();
}
void CGameMain::FirstInit() {
new CPlayer(160, 120);
}
void CGameMain::Run() {
Move();
Draw();
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
Game = new CGameMain();
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
Game->Run();
}
delete Game;
}
Re: 関数のオーバーライドがされていない。(初学者)
Posted: 2017年4月27日(木) 19:11
by usao
>どこかおかしな点はありますか?
何がおかしいのかを問うよりも前に,
まず,
このコードが どのように動くと想定しているのか について具体的に説明した方が早そうです.
提示コードからではそのあたりの事柄が読み取れません.
Re: 関数のオーバーライドがされていない。(初学者)
Posted: 2017年4月27日(木) 19:27
by かずま
keito94 さんが書きました:メインプログラムのコードをあげます。どこかおかしな点はありますか?
Main.cpp の 17行目がおかしい。
new CPlayer(160, 120) の実行結果であるポインタをどこにも格納していません。
これでは、生成された CPlayerオブジェクトを使用することができません。
こんなことを書くということは、C++ の基礎を全く理解していないと思われます。
Re: 関数のオーバーライドがされていない。(初学者)
Posted: 2017年4月27日(木) 19:34
by keito94
usao さんが書きました:
このコードが どのように動くと想定しているのか について具体的に説明した方が早そうです.
提示コードからではそのあたりの事柄が読み取れません.
Main.cppのMoveとDrawにPlayer.cppのMoveとDrawをオーバーライドさせ、Runでそれを動作させるのですが、
実行してみるとMain.cppのMoveとDrawにPlayer.cppのMoveとDrawが何故かオーバーライドされず、黒い画面が表示されてしまいます。
Re: 関数のオーバーライドがされていない。(初学者)
Posted: 2017年4月27日(木) 19:47
by purin52002
継承をちゃんと理解されてないのかもしれません。
コード:
#include<iostream>
using namespace std;
class Super
{
public:
virtual void func() { cout << "super" << endl ; }
};
class Sub : public Super
{
public:
void func(){ cout << "sub" << endl ; }
};
int main()
{
Super* super = new Super();//Superクラスを作る
Super* sub = new Sub();//Subクラスを作る
super->func();// super と表示
sub->func();// sub と表示
}
keito94さんはせっかく派生クラスを作ったのに基底クラスをnewしているみたいです。
Re: 関数のオーバーライドがされていない。(初学者)
Posted: 2017年4月27日(木) 20:13
by keito94
皆様方は、僕が継承もわからないC++初心者であることをよくご指摘なさいました。
この件は一旦解決とさせていただき、C++の訓練に励みたいと思います。
Re: 関数のオーバーライドがされていない。(初学者)
Posted: 2017年4月27日(木) 20:22
by purin52002
クラスはややこしいですが、使えるようになると非常に強力な武器になるはずです。
ふぁいと^p^