関数のオーバーライドがされていない。(初学者)
関数のオーバーライドがされていない。(初学者)
関数のオーバーライドと言うものを利用して、何かのプログラムを作ろうとしているのですが、
どういうわけか関数のオーバーライドがされず、黒い画面のみが表示されるのみです。
関数がオーバーライドされない原因はどこにありますか?
メインプログラムの宣言 メインプログラム オーバーライドされる部分の宣言 オーバーライドされる部分
どういうわけか関数のオーバーライドがされず、黒い画面のみが表示されるのみです。
関数がオーバーライドされない原因はどこにありますか?
メインプログラムの宣言 メインプログラム オーバーライドされる部分の宣言 オーバーライドされる部分
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
- Dixq (管理人)
- 管理人
- 記事: 1661
- 登録日時: 13年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 関数のオーバーライドがされていない。(初学者)
提示されているプログラムの抜粋が良くないです。
どこが親クラスなのかどこが子クラスなのかどこに継承しているのかが良く分かりません。
オーバーライド先にはvirtuslではなくoverride修飾子を使いますし、
メインプログラムが継承元のように見えますが、そこから派生するのもおかしいです。
全体を見せてください。
どこが親クラスなのかどこが子クラスなのかどこに継承しているのかが良く分かりません。
オーバーライド先にはvirtuslではなくoverride修飾子を使いますし、
メインプログラムが継承元のように見えますが、そこから派生するのもおかしいです。
全体を見せてください。
Re: 関数のオーバーライドがされていない。(初学者)
>>DIXQさん
わかりました。
ソースコード全体を掲示します。
Joypad.h
JoyPad.cpp
Player.h
Player.cpp
Mover.h
Mover.cpp
わかりました。
ソースコード全体を掲示します。
Joypad.h
#pragma once
class CJoyPad {
public:
int Input, EdgeInput;
void Update();
int Get(int JoyPadCode);
};
#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;
}
#pragma once
#include "Mover.h"
class CPlayer : public CMover {
int Dir;
public:
CPlayer(float x, float y);
virtual bool Move();
virtual void Draw();
};
#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);
}
#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);
};
#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;
}
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
- purin52002
- 記事: 235
- 登録日時: 7年前
- 連絡を取る:
Re: 関数のオーバーライドがされていない。(初学者)
管理人さんの言う通りvirtualのつけ方を間違ていると思います。
派生クラスのCPlayerにvirtualがついているので、CMoverにつけてあげてください。
派生クラスのCPlayerにvirtualがついているので、CMoverにつけてあげてください。
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
Re: 関数のオーバーライドがされていない。(初学者)
virtualをCMoverにつけてあげたのですが、プログラムの画像が表示されません。
メインプログラムのコードをあげます。どこかおかしな点はありますか?
Main.h
Main.cpp
メインプログラムのコードをあげます。どこかおかしな点はありますか?
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;
//デバッグのトレーニングついでに作り直す。
#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: 関数のオーバーライドがされていない。(初学者)
>どこかおかしな点はありますか?
何がおかしいのかを問うよりも前に,
まず,
このコードが どのように動くと想定しているのか について具体的に説明した方が早そうです.
提示コードからではそのあたりの事柄が読み取れません.
何がおかしいのかを問うよりも前に,
まず,
このコードが どのように動くと想定しているのか について具体的に説明した方が早そうです.
提示コードからではそのあたりの事柄が読み取れません.
Re: 関数のオーバーライドがされていない。(初学者)
Main.cpp の 17行目がおかしい。keito94 さんが書きました:メインプログラムのコードをあげます。どこかおかしな点はありますか?
new CPlayer(160, 120) の実行結果であるポインタをどこにも格納していません。
これでは、生成された CPlayerオブジェクトを使用することができません。
こんなことを書くということは、C++ の基礎を全く理解していないと思われます。
Re: 関数のオーバーライドがされていない。(初学者)
Main.cppのMoveとDrawにPlayer.cppのMoveとDrawをオーバーライドさせ、Runでそれを動作させるのですが、usao さんが書きました: このコードが どのように動くと想定しているのか について具体的に説明した方が早そうです.
提示コードからではそのあたりの事柄が読み取れません.
実行してみるとMain.cppのMoveとDrawにPlayer.cppのMoveとDrawが何故かオーバーライドされず、黒い画面が表示されてしまいます。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
- purin52002
- 記事: 235
- 登録日時: 7年前
- 連絡を取る:
Re: 関数のオーバーライドがされていない。(初学者)
継承をちゃんと理解されてないのかもしれません。
keito94さんはせっかく派生クラスを作ったのに基底クラスをnewしているみたいです。
#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 と表示
}
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
Re: 関数のオーバーライドがされていない。(初学者)
皆様方は、僕が継承もわからないC++初心者であることをよくご指摘なさいました。
この件は一旦解決とさせていただき、C++の訓練に励みたいと思います。
この件は一旦解決とさせていただき、C++の訓練に励みたいと思います。
デバッグは投げ捨てるものではない。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
今までの質問でこれは学んだこと。
質問する時は、必ずちゃんと調べた上に問題をもとにした仕様書を作ってから質問すること。
仕様書の大切さを改めて思い知った…。
- purin52002
- 記事: 235
- 登録日時: 7年前
- 連絡を取る:
Re: 関数のオーバーライドがされていない。(初学者)
クラスはややこしいですが、使えるようになると非常に強力な武器になるはずです。
ふぁいと^p^
ふぁいと^p^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^