こんにちは。私は現在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も見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
既定のコンストラクタがない?
C言語・C++・C#
-
適切な変換関数が存在しない???
C言語・C++・C#
-
【C++】関数ポインタの使い方
C言語・C++・C#
-
-
4
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
5
<unistd.h>をVisualStudioでつかえるようにする
C言語・C++・C#
-
6
静的でないメンバ関数の呼び出しが正しくありません
C言語・C++・C#
-
7
c++,ある関数のクラスから別のクラスの関数を呼ぶ
C言語・C++・C#
-
8
python エラー
その他(プログラミング・Web制作)
-
9
GetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・
C言語・C++・C#
-
10
構造体のメンバをfor文で回したい
C言語・C++・C#
-
11
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
12
C++でアボート(Abort)で処理が強制終了してしまう
C言語・C++・C#
-
13
構造 他のクラスの構造体を別のクラスで使いたい。
C言語・C++・C#
-
14
C++で空Enterの入力を判断したい!!
C言語・C++・C#
-
15
VC++でSQL Serverに接続するにはどのようにしたらよいでしょ
C言語・C++・C#
-
16
0xffffとは?
C言語・C++・C#
-
17
wsprintf関数の使い方について
C言語・C++・C#
-
18
cout関数を使っているのですが,画面に出力されません。
C言語・C++・C#
-
19
VC++から引数付きexeファイルの実行
C言語・C++・C#
-
20
C++ 構造体の一括初期化 {0}
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
既定のコンストラクタがありま...
-
Notepad++の関数リスト表示の変...
-
C++にてtemplateで受け取った任...
-
ArduinoでMouse関数を使用して...
-
WNDPROC をクラスのメンバにも...
-
const_castのつかいどころを教...
-
【gcc・cygwin】multiple defin...
-
int main()、void main()、void...
-
コンパイルエラー: LNK2001
-
(void)0 はどんな意味ですか
-
解凍ソフト(C++builderで作成...
-
解凍ソフト(C++builderで作成...
-
C/C++でのScene管理について
-
一定時間ごとにプログラムを起...
-
VC++でGetKeyboardStateがうま...
-
C++別のオブジェクトからメンバ...
-
C# Controls.Addで動的に配置し...
-
【VC++6.0】イベントハンドラ関...
-
OpenSSLのSHA1関連の関数はどこ...
-
定義した文字列を wchar_t 系の...
マンスリーランキングこのカテゴリの人気マンスリー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 でのエラー
おすすめ情報