先日「クラスをnewで作成するとウインドウが表示されなくなる」というタイトルで
質問させていただいた山崎です。
ちょっとこちらの質問が簡略化しすぎたせいかわかりにくくなってしまい、
且つ悩んでいるうちに原因が見えてきた気がするので再度改めまして別の質問させて頂きたく思います。
なお、前回の質問は下の方にそのまま残しておりますので、
よろしければご覧頂きたいと思います。
記事をあげてしまい、他の質問者の方にはご迷惑をおかけして誠に申し訳ございません。
現在プログラムをファイルに分割していく作業を行っています。
次のような3つのヘッダファイルがありそれぞれクラスが記述されているとします。
----------------A.h--------------------
class classA
{
classB b;
};
----------------B.h---------------------
class classB
{
classC c;
};
----------------C.h---------------------
class classC
{
classA a;
};
このように3すくみのような関係で各クラスが各クラスのインスタンスをメンバに持っている場合、
どのように#includeしていけばよいのでしょうか。
classAはclassBのインスタンスをメンバに持つため、A.hの最初でB.hをインクルードしなければならず、
classBはclassCのインスタンスをメンバに持つため、B.hの最初でC.hをインクルードしなければならず、
classCはclassAのインスタンスをメンバに持つため、C.hの最初でA.hをインクルードしなければならず・・・
というのが永遠に続いてしまうのでしょうか。
それぞれのヘッダファイルに#ifndefと#defineをつけて多重インクルードを避けるようにしてみましたが、
C.hでA.hをインクルードしたにもかかわらず「classA a;」の行で「型名が必要」というエラーになります。
皆様のお知恵を借りたいと思います。よろしくお願いします。
以下は、前回の質問の内容です。
-----------------------------------------------------------------------
毎度毎度お世話になっております、山崎です。
最近何度も質問しにきて誠に申し訳ございません。
この度は、ビルドは通るのですが実行開始してもウインドウが立ち上がらないことについて
お伺いに参りました。
現在、主人公の技をつかさどるクラスなどを作っております。
すべての技のベースとなる親クラスSkillBaseクラスを作成し、
それを継承してそれぞれの技となる子クラスを作っていこうと思っております。
技となる子クラスは必要なときにnewで確保し、親クラスの配列に格納して利用しようと思っています。
しかし、親クラスの配列に子クラスのインスタンスを格納するという一行を加えると、
ビルドは通るのですが実行するとウインドウが立ち上がりません。
タスクマネージャを開くとプロセスの中にはそれまで作成していたプログラムが
動いていてCPUの50%ほどを占めているのですが、タスクバーには表示されません。
おそらくこの問題に関係しているのは3つのファイルで、
技クラスの宣言も定義も記述されたSkill.h、
主人公をつかさどるクラスなどの宣言を記述したShujinko.h、
その動作を記述したShujinko.cppです。
コードは以下のような感じになっております。
------------Skill.h-----------------
#include "Shujinko.h"
...
class SkillBase{
...
public
virtual void SkillMain(){};
};
class Fire:public SkillBase{
...
public:
void SkillMain(){
...
(Shujinkoクラスのインスタンスを使った処理)
...
}
};
-------------Shujinko.h--------------
...
class SkillBase;//前方宣言(?)しておく
class Shujinko{
SkillBase* Skills[3];
...
public:
Shujinko();
...
};
------------Shujinko.cpp---------------
#include "Shujinko.h"
#include "Skill.h"
...
void Shujinko::Shujinko(){
Skills[0]=new Fire();//この行を付け加えると実行してもウインドウが表示されない
}
プログラムが7つのファイルに分かれコードも何百行かあるので
おそらく不具合の原因が関係しているであろう部分のコードだけを
簡略化して載せました。
本物のファイルにはもっとさまざまなクラスが記述されております。
どうすればウインドウを表示できるようになるのでしょうか。
皆様のお力をお借りしたいと思います。
これまでにも何度か、今回の相談以外にもビルドは通ったのに実行してもウインドウが立ち上がらないことがありました。
いろいろ書いたり消したりしているうちにいつのまにかウインドウが立ち上がるようになったり結局あきらめたりしていたのですが、
この現象には共通点があるのでしょうか。
(改題)ウインドウが表示されない+循環するインクルードについて
Re:クラスをnewで作成するとウインドウが表示されなくなる
うーん、省略化されていない部分を見る限りでは、
ウインドウが表示されなくなるといった問題は判らないですね。
ウインドウが立ち上がらないのと、CPUの50%ほどを占めているあたり(デュアルコア?)、
どこかで無限ループが行われている可能性があります。
もし、差し支えないのであれば、ソースファイルを圧縮して添付していただけませんか?
ウインドウが表示されなくなるといった問題は判らないですね。
ウインドウが立ち上がらないのと、CPUの50%ほどを占めているあたり(デュアルコア?)、
どこかで無限ループが行われている可能性があります。
もし、差し支えないのであれば、ソースファイルを圧縮して添付していただけませんか?
Re:クラスをnewで作成するとウインドウが表示されなくなる
>御津凪さん
ご返信まことにありがとうございます。
誠にお恥ずかしいながら、私の稚拙なプログラムを添付させて頂きますね。
試行錯誤の塊ですので、お見苦しいコードや非効率なプログラムもあると思います・・・。
とりあえず、3つのファイルを添付させていただきます。
もしほかのファイルも必要なようでしたら、お手数ですがおっしゃってもらいますと幸いです。
上の記事では主人公のクラスであることを示すためにShujinkou.hとしましたが、
本物はTools.hというファイルにいろいろなものをまとめてあります。
ハードはあまり詳しくないので確かなことは言えないのですが、
確かデュアルコアだったと思います。
私にとっては宝の持ち腐れですね。
よろしくお願いいたします。
ご返信まことにありがとうございます。
誠にお恥ずかしいながら、私の稚拙なプログラムを添付させて頂きますね。
試行錯誤の塊ですので、お見苦しいコードや非効率なプログラムもあると思います・・・。
とりあえず、3つのファイルを添付させていただきます。
もしほかのファイルも必要なようでしたら、お手数ですがおっしゃってもらいますと幸いです。
上の記事では主人公のクラスであることを示すためにShujinkou.hとしましたが、
本物はTools.hというファイルにいろいろなものをまとめてあります。
ハードはあまり詳しくないので確かなことは言えないのですが、
確かデュアルコアだったと思います。
私にとっては宝の持ち腐れですね。
よろしくお願いいたします。
Re:クラスをnewで作成するとウインドウが表示されなくなる
遅くなりました。
添付したファイルを確認しても、該当する箇所が見つけられませんでした。
このままでは実行確認が取れないので、一通りのファイルの添付をお願い出来ますでしょうか。
mitsunagistudio@gmail.com
(もし掲示板のほうで出したくない場合は、上の空行の部分を選択して見えるメールアドレスに添付して送ってください。)
添付したファイルを確認しても、該当する箇所が見つけられませんでした。
このままでは実行確認が取れないので、一通りのファイルの添付をお願い出来ますでしょうか。
mitsunagistudio@gmail.com
(もし掲示板のほうで出したくない場合は、上の空行の部分を選択して見えるメールアドレスに添付して送ってください。)
Re:クラスをnewで作成するとウインドウが表示されなくなる
御津凪様
メールのほうでもご連絡いたしましたが、
この度は誠にありがとうございました。
これからは、DXライブラリの初期化より前にDXライブラリの関数を呼ぶことの無いよう
更なる注意を払っていきたいと思います。
何から何まで、親切な対応をしていただき感謝と主に感動しております。
本当にありがとうございました。
メールのほうでもご連絡いたしましたが、
この度は誠にありがとうございました。
これからは、DXライブラリの初期化より前にDXライブラリの関数を呼ぶことの無いよう
更なる注意を払っていきたいと思います。
何から何まで、親切な対応をしていただき感謝と主に感動しております。
本当にありがとうございました。