こんにちは。私は現在C++を学習中の者です。
現在、
「実例で学ぶゲームAIプログラミング」(オライリージャパン)
という本で学習をしているのですが、試しに組んでみた非常に簡単なプログラムでエラーが出て、原因が分からず困っています。
初歩の部分で恐縮なのですが、クラス自身に状態遷移の機能を持たせようとしているようです。
以下のコードは実際にエラーが出たコードです。
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
class Troll;
class State{
public:
virtual void Execute(Troll* troll) = 0;
};
class Troll{
State* m_pCurrentState;
public:
void Update(){ m_pCurrentState->Execute(this); }
void ChangeState(State* pNewState){ delete m_pCurrentState; m_pCurrentState = pNewState; }
bool isSafe();
bool isThreatened();
void Snore(){ cout << " I am sleeping zzz... " << endl;}
void MoveAwayFromEnemy(){ cout << " Run Away!!" << endl;}
};
bool Troll::isSafe(){
int safe = (int)((rand() / ((double)RAND_MAX+1.0f)) * 10);
if(safe >= 5) return true;
else return false;
}
bool Troll::isThreatened(){
int threat = (int)((rand()/((double)RAND_MAX+1.0f))*10);
if(threat >= 3) return true;
else return false;
}
class State_Sleep;
class State_Runaway: public State{
void Execute(Troll* troll){
if(troll->isSafe()){troll->ChangeState(new State_Sleep());} ←エラー
else{troll->MoveAwayFromEnemy();}
}
};
class State_Sleep : public State{
public:
void Execute(Troll* troll){
if(troll->isThreatened()){ troll->ChangeState(new State_Runaway());}
else{ troll->Snore();}
}
};
main以下は書いていません。
この中で、State,State_Runaway,State_Sleep,は本の丸写しです。
また、Trollの中のpublic以下の、スペースで区切っている部分より上も、丸写しです。スペース以下は動かす為に必要と思い適当につくってみました。
(本では、「このようなのを使えば上手くできるよ」というかんじで、上記の様に部分的に載っていて、一つの完成したコードはありませんでした。)
上記コードの、エラー、と書いた部分で、「クラス、構造体、共用体に既定のコンストラクタがありません。」のエラーが出ます。
自分なりに意味も調べてみて、コンストラクタを定義してるのに、デフォルトコンストラクタを呼び出そうとしてる時に起こるエラーと理解したのですが、上記のコードにどう関わってくるのか良くわかりませんでした。
あとその部分で、new State_Runaway()としていますが、これも意味がわかりませんでした。
new State_Runaway、ではないのでしょうか。
そうしても同じエラーが出ましたが…。
継承クラス等を使うのが初めてなので、かなり初歩的なところでつまずいてる気がするのですが、どういうことかわかる方がいらっしゃいましたらお教え頂ければ幸いです。
No.1ベストアンサー
- 回答日時:
ここでは継承は全く関係ありません.
例えば「new State_Sleep()」って「クラス State_Sleep のデフォルトコンストラクタ」を呼び出すよね.
ちなみにコンストラクタを呼び出すためにはクラスを定義しておく必要があります.
この回答への補足
返答が遅くなってしまいましたが、ありがとうございます!!
ご指摘の通り、Executeの中身をクラスの外、定義が必要なクラスの下に移す事で解決しました。
また、new State()とnew State は表記が違うだけで同じ意味なのですね。
恥ずかしい質問でした。もっと基礎を勉強すべきでした。
少し疑問に思った事があるので追加で質問させて頂いても宜しいでしょうか。
この場合の様に、上から読んでいって、定義から先に書くようにする以外方法はないのでしょうか?
例えば上記コードの上の方で、
class Troll;
class State{
public:
virtual void Execute(Troll* troll) = 0;
};
という部分があります。
私は一度、Trollクラスはこの下で定義してるから…、とコンパイルし、(当然)失敗して、class Troll; という一文を後から付け加えました。
今回の質問も、同じような事で詰まっていたようです。
ですが、主観ですが、class Troll; とわざわざ書くのは醜いコード、というか、C++のプロの方から見れば「そんな事書かなくても別の方法があるのに。」というような気がしてなりません。
このclass Troll;のように、どんな事があっても、使う前(上)で定義しておいて、コンパイラに教えてあげなくてはいけないのでしょうか??
何か抜け道等は無いのでしょうか?
ちょっと気になるので新しく質問させて頂きました。
回答の締め切り、ポイントの付与、をもう少しお待ちください。
もちろん回答頂けずとも適度に締め切って、あらためてポイント付与とお礼させて頂きます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# int tff(int clk) { static int state = 0; //状態 stat 1 2022/07/11 21:14
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- その他(プログラミング・Web制作) micropython コードについて 2 2023/06/14 13:13
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
既定のコンストラクタがない?
C言語・C++・C#
-
適切な変換関数が存在しない???
C言語・C++・C#
-
【C++】関数ポインタの使い方
C言語・C++・C#
-
-
4
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
5
c++,ある関数のクラスから別のクラスの関数を呼ぶ
C言語・C++・C#
-
6
静的でないメンバ関数の呼び出しが正しくありません
C言語・C++・C#
-
7
C++でアボート(Abort)で処理が強制終了してしまう
C言語・C++・C#
-
8
python エラー
その他(プログラミング・Web制作)
-
9
cout と cerrの違い
C言語・C++・C#
-
10
GetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・
C言語・C++・C#
-
11
構造体のメンバをfor文で回したい
C言語・C++・C#
-
12
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
13
VC++でSQL Serverに接続するにはどのようにしたらよいでしょ
C言語・C++・C#
-
14
構造 他のクラスの構造体を別のクラスで使いたい。
C言語・C++・C#
-
15
画面を強制的に再描画させる方法
C言語・C++・C#
-
16
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
17
他の.CPPファイルに定義した関数を呼び出す方法について
C言語・C++・C#
-
18
wsprintf関数の使い方について
C言語・C++・C#
-
19
0xffffとは?
C言語・C++・C#
-
20
C言語、C+、C++、C#の違い
その他(パソコン・スマホ・電化製品)
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
戻り値を返す関数の前に(void)...
-
既定のコンストラクタがありま...
-
C# KeyDownイベントでショート...
-
gcc: incompatible pointer type
-
多重定義が起きている?--lnk20...
-
H8マイコンのシリアル通信につ...
-
関数ポインタについて
-
LNK2019:未解決の外部シンボル ...
-
C++にてtemplateで受け取った任...
-
_beginthreadにて発生するコン...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
C#を勉強中でC#で壁紙を変更す...
-
C# Controls.Addで動的に配置し...
-
ウインドウの移動禁止
-
LEDで電光掲示板に「A B C D E...
-
マルチメディアタイマーの使用方法
-
int main()、void main()、void...
-
_beginthread()の使用について
-
リージョンのフレームを描画す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
int main()、void main()、void...
-
戻り値を返す関数の前に(void)...
-
既定のコンストラクタがありま...
-
Notepad++の関数リスト表示の変...
-
ArduinoでMouse関数を使用して...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
静的でないメンバ関数の呼び出...
-
C# Controls.Addで動的に配置し...
-
const_castのつかいどころを教...
-
(void)0 はどんな意味ですか
-
C# KeyDownイベントでショート...
-
gcc: incompatible pointer type
-
C#でラジオボタンを設定に記録...
-
VC++でGetKeyboardStateがうま...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
void*型の配列について
-
GDI+の使用方法について
-
DirectInput でのエラー
おすすめ情報