ページ 11

C++ 継承 エラー「メンバ関数が '~' で宣言されていません。」

Posted: 2012年12月19日(水) 22:52
by マサヒコ
はじめまして 夜分遅くに質問失礼します。
C#でのゲーム制作は少しやったことがあるのですが、今回初めてC++でゲームを作ってみようとしました。
しかし、いきなりクラスの継承でつまずいてしまいました。

いろんなオブジェクトの親にしたいヘッダーファイル「Object.h」

コード:

#ifndef OBJECT_H
#define OBJECT_H
#include "DxLib.h"

class Object
{
private:
	//変数
	int ModelHandle;//モデルハンドルの保存
	VECTOR Vect;//モデルの座標

public:
	//関数
	Object();//コンストラクタ

	virtual void ModelLoad();//モデルのロード
	virtual void Action();//モデルの操作、動作
	virtual void Render();//レンダリング

	void Initialize();//初期化
	void Update();//アップデート

	~Object();//デストラクタ
};
#endif


上のヘッダーファイルをインクルードした親「Object.cpp」

コード:

#include "Object.h"

//コンストラクタ
Object::Object()
{
	//ModelLoad();
}

void Object::ModelLoad(){}//モデルのロード
void Object::Action(){}//モデルの操作、動作
void Object::Render(){}//レンダリング

//初期化
void Object::Initialize(){}
//アップデート
void Object::Update()
{
	Action();
	Render();
}

Object::~Object(){}//デストラクタ


Objectを親にして作りたい子クラス「Jiki.h」

コード:

#ifndef JIKI_H
#define JIKI_H
#include "Object.h"


class Jiki : public Object
{
private:
	int ModelHandle;//モデルハンドルの保存
	VECTOR Vect;//モデルの座標

public:
	Jiki();//コンストラクタ
	~Jiki();//デストラクタ
};
#endif


Jiki.hをインクルードする「Jiki.cpp」

コード:

#include "Jiki.h"

Jiki::Jiki(){}//コンストラクタ

void Jiki::ModelLoad()
{
}

Jiki::~Jiki(){}//デストラクタ


こうすると「error C2509: 'ModelLoad' : メンバ関数が 'Jiki' で宣言されていません。」というエラーがでてしまいます。

Jiki.hに「void ModelLoad();」を追加すると大丈夫なのですが、そのような方法でいいのでしょうか?
自分の書き方が悪くて継承できてないだけでしょうか?
回答よろしくお願いいたします。


環境  Windows7 Visual Studio 2008
使用ライブラリ DXライブラリ

Re: C++ 継承 エラー「メンバ関数が '~' で宣言されていません。」

Posted: 2012年12月19日(水) 23:00
by マサヒコ
すみません。ひとつコードに間違えがありました。

Jiki.hは

コード:

#ifndef JIKI_H
#define JIKI_H
#include "Object.h"


class Jiki : public Object
{
private:

public:
	Jiki();//コンストラクタ
	~Jiki();//デストラクタ
};
#endif
こうでした。
とはいっても変数の宣言がないだけなので今回のエラーには関係ないと思いますが。
ちなみにこうした変数は子クラスで別個に宣言するのでしょうか?
ゲッター、セッターを作って受け渡すほうがプログラム的にいいのでしょうか?

Re: C++ 継承 エラー「メンバ関数が '~' で宣言されていません。」

Posted: 2012年12月19日(水) 23:34
by nil
Jiki::ModelLoadがヘッダーに宣言されていないのにじっそうされているからです。
おっしゃるとおり宣言を追加するだけでいいです

Re: C++ 継承 エラー「メンバ関数が '~' で宣言されていません。」

Posted: 2012年12月19日(水) 23:54
by マサヒコ
では、「親クラスを継承した子クラスで親クラスの関数を使いたい時は子クラス用のヘッダーファイルにも同じ宣言を書く」
(仮想関数のオーバーライドを行う)という認識でよろしいのでしょうか?

Re: C++ 継承 エラー「メンバ関数が '~' で宣言されていません。」

Posted: 2012年12月20日(木) 00:49
by h2so5
マサヒコ さんが書きました:では、「親クラスを継承した子クラスで親クラスの関数を使いたい時は子クラス用のヘッダーファイルにも同じ宣言を書く」
(仮想関数のオーバーライドを行う)という認識でよろしいのでしょうか?
その場合は子クラスで関数を実装する必要がありません。

void Object::ModelLoad(){} があるので
void Jiki::ModelLoad() {} は不要です。

Re: C++ 継承 エラー「メンバ関数が '~' で宣言されていません。」

Posted: 2012年12月20日(木) 01:14
by マサヒコ
h2so5 さんが書きました: その場合は子クラスで関数を実装する必要がありません。

void Object::ModelLoad(){} があるので
void Jiki::ModelLoad() {} は不要です。
今回の問題は子クラスで実装することで解決する方法がベターで、自分がNo.4で言ったことは
また別の問題を私が認識間違いをしているということでしょうか?

Re: C++ 継承 エラー「メンバ関数が '~' で宣言されていません。」

Posted: 2012年12月20日(木) 01:29
by マサヒコ
マサヒコ さんが書きました: 今回の問題は子クラスで実装することで解決する方法がベターで、自分がNo.4で言ったことは
また別の問題を私が認識間違いをしているということでしょうか?
ベターというのは「継承の仕方としてそれが正しいのか?」ということです。
わかりづらい表記失礼しました。

Re: C++ 継承 エラー「メンバ関数が '~' で宣言されていません。」

Posted: 2012年12月20日(木) 01:49
by softya(ソフト屋)
親クラスで関数の処理が定義できるなら、子クラスは親からメンバ関数を継承するので定義しなくて良いと言うことです。
子クラスで定義必須=オーバーライド必須なら親クラスで純仮想関数にしてしまう必要があります。
子クラスでオーバーライドして、親クラスのポインタとして使う多態性を利用する場合は仮想関数にしないと親クラスのポインタからは親クラスのメンバ関数が呼び出されます。

Re: C++ 継承 エラー「メンバ関数が '~' で宣言されていません。」

Posted: 2012年12月20日(木) 02:45
by マサヒコ
なるほど。試しにちょっとした処理を親クラス(Object)で定義した関数を
main.cppでインスタンス化したJikiクラスから呼び出してみたところ
問題なく呼び出せました。こんな違いがあったのですね。

今回の問題は
「子クラスで定義=オーバーライドする」「純仮想関数を使う」ことで解決できそうです。
夜遅くまでありがとうございました。