トップページ > 過去ログ > 記事閲覧
クラスの継承で
名前:素人 日時: 2008/09/15 22:53

VC2008での作業中、CCharactorクラスを継承したクラスの作成を行いたいのですが、 error C2504: 'CCharactor' : 定義されていない基本クラスが宣言されています。 というエラーが発生します。 ソースの構造は、非常に簡単に書くと以下のような形になっています。 <Charactor.h> #include "GameDef.h" class CCharactor : public CGameObject { (省略) }; <Player.h> #include "Charactor.h" class CPlayer : public CCharactor { (省略) }; なお、省略部分はコメントアウトしてビルドした際も同じエラーが発生したため恐らく関係ないと考えて記載しております。 このようにそれぞれ別のファイルに分割しております。 ちなみに、ファイルを分割せずに同じファイルに続けてクラスの宣言を行った場合は上記のエラーメッセージは発生しませんでした。 私は恐らくインクルード関係が原因かと思いいろいろ試してみたのですが、結局対処法の見当がつきませんでした。 どのようにすればこの問題が解決するのか、分かりましたら教えていただけると助かります。どうかよろしくお願いします。

Page: 1 |

Re: クラスの継承で ( No.1 )
名前: 日時:2008/09/16 00:38

提示された情報を信じるならば、 VC6とVS2005ではなんともなかったです。 #たぶん2008だからということも無いでしょう。 とりあえず使われているCCharactorの綴りに 間違いが無いかどうか確認してみてください。 程度しかいえません。 >error C2504: 'CCharactor' : 定義されていない >基本クラスが宣言されています。 エラーをクリックすればどこで出ているか、 わかると思いますが、このエラーが出ているのは 本当にPlayerクラスですか?
Re: クラスの継承で ( No.2 )
名前:GPGA 日時:2008/09/16 01:09

私が、時々やるミスで、インクルードガードの修正忘れがあります。 Charactor.hを作る時にほかのヘッダーファイルをコピペして 中身を書き換える場合、インクルードガードの部分の修正を 忘れていて、コピー元になったヘッダーファイルとCharactor.hを Player.hでインクルードしている場合、Charactor.hが無効となります。 #pragma oneを使用していれば、問題ないのですが、 #ifdef〜#endifを使っているのであれば、このようなミスをしていないかどうか 確認してみてください。
Re: クラスの継承で ( No.3 )
名前:GPGA 日時:2008/09/16 11:34

誤字の修正 × #pragma one ○ #pragma once
Re: クラスの継承で ( No.4 )
名前:素人 日時:2008/09/17 00:07

GPCAさん、通さん、どうもありがとうございます。 ソースを書き出す際にインクルードガードの部分を記入し忘れてしまいました。GPCAさんのおっしゃられている通り#ifndef〜#endifを使っていたのでそれらを全て#pragma onceに修正してみましたが、残念ながら直りませんでした。 CCharactorの綴りについてはエディタの検索等も使って確かめたので、何か凡ミスをしていなければ間違っていないと思います。 >このエラーが出ているのは本当にPlayerクラスですか? 省略してしまいましたが、エラーメッセージでは以下のように出ていました。 (保存先アドレス)\player.h(8) : error C2504: 'CCharactor' : 定義されていない基本クラスが宣言されています。 何か他にこのエラーの解決法等に心当たりがありましたらどうかよろしくお願いします。
Re: クラスの継承で ( No.5 )
名前: 日時:2008/09/17 01:38

>ミスをしていなければ間違っていないと思います。 思いますって。。。 なぜ間違っていないと言い切れないのか。。。? きちんと調べたのですよね。。。? 現状の情報では少なすぎて、 心当たりがあっても指摘することができません。 差支えなければ、該当するコードを貼り付けた方が 小出しにするより、問題を早く解決できると 思いますが。。。
Re: クラスの継承で ( No.6 )
名前:素人 日時:2008/09/18 00:46

長くなってしまうのでなるべく避けたかったのですが、それではソースコードを張らせて頂きたいと思います。 <GameDef.h> #pragma once #include "DxLib.h" #include "GameObject.h" #include "Charactor.h" #include "Player.h" <Charactor.h> #pragma once #include "GameDef.h" class CCharactor : public CGameObject { public: CCharactor(); protected: float fx, fy; }; <Player.h> #pragma once #include "Charactor.h" class CPlayer : public CCharactor { public: CPlayer(); private: int img_player[4]; }; <Charactor.cpp> #include "Charactor.h" CCharactor::CCharactor() { fx = 0.0f; fy = 0.0f; } <Player.cpp> #include "Player.h" CPlayer::CPlayer() { LoadDivGraph( "Sh/img/char/player.png", 4, 4, 1, 32, 48, img_player ); } あまり長くなりすぎないよう纏めたつもりですが、だいたいこのような形です。長くなってしまい申し訳ありません。 何か分かりましたらどうかよろしくお願いします。
Re: クラスの継承で ( No.7 )
名前:GPGA 日時:2008/09/18 04:05

Charactor.h内部でGameDef.hをインクルードしているのがエラーの原因です。 Charactor.h内ではGameObject.hだけをインクルードるようにしましょう。 基本的に、不要なヘッダーはインクルードしないほうがいいです。 余計なエラーが出る可能性が減りますし、コンパイル速度低下の防止もできます。 今回のエラーの詳細はインクルードをそのまま展開すればわかりますが、Charactor.h内で CPlayerクラスの定義が、CCharactorクラスの定義の上に来るからです。
Re: クラスの継承で ( No.8 )
名前: 日時:2008/09/18 09:57

>長くなってしまうので >なるべく避けたかったのですが 確かに長くなりますが、問題解決が長引けば レスの数が増えて逆に後にこのスレッドを見る人に 分かりづらくなります。 >長くなってしまい申し訳ありません いえいえ、今回くらいのコードは まだ短いほうだと思いますし。 本題ですが、既にGPGAさんが 回答している通りですね。 Charactor.h内では、 GameDef.hではなく、 GameObject.hをIncludeしましょう。
Re: クラスの継承で ( No.9 )
名前:素人 日時:2008/09/18 21:22

通さん、GPCAさん、どうもありがとうございます。 助言していただいたように修正した結果、無事エラーが解消されました。 どうもありがとうございました。

Page: 1 |