
こんにちは。私は現在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#
-
-
4
外部依存関係について
C言語・C++・C#
-
5
読み込み中にアクセス違反が発生しました、と出ます。これを回避することは
C言語・C++・C#
-
6
ボタンの配置を変更したい
C言語・C++・C#
-
7
cout と cerrの違い
C言語・C++・C#
-
8
エディットボックスのフォントを変えたい
C言語・C++・C#
-
9
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
10
【C++】関数ポインタの使い方
C言語・C++・C#
-
11
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
12
C++ protectedにアクセス不可
C言語・C++・C#
-
13
1 つ以上の複数回定義されているシンボルが見つかりました
C言語・C++・C#
-
14
CString から LPCTSTRの型に変換
C言語・C++・C#
-
15
C++で入力した文字列から数字を取り除くもしくは数字のみをのこす
C言語・C++・C#
-
16
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
17
型変換
C言語・C++・C#
-
18
char*を初期化したいのですが
C言語・C++・C#
-
19
C++でアボート(Abort)で処理が強制終了してしまう
C言語・C++・C#
-
20
LPSTR型の初期化について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
4桁7セグでダイナミック点灯
-
組み込みマイコン
-
一定時間ごとにプログラムを起...
-
C#でトーンカーブの作成
-
多重定義が起きている?--lnk20...
-
カノニカルモードの設定について
-
(void)0 はどんな意味ですか
-
「Aに対するBの割合」と「Aに対...
-
信頼区間の1.96や1.65ってどこ...
-
有効数字について 以前質問をし...
-
Fortran において変数の定義
-
memcpyについて
-
C++の課題が分かりません。
-
Unicode でのWin32アプリのプロ...
-
.NET 小数点以下の切り捨てにつ...
-
バイナリ形式の読み込み
-
c言語マップ探査ゲーム プログ...
-
2÷3などの余りについて
-
c++ 文字列を入力して、一文字...
-
C言語について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
多重定義が起きている?--lnk20...
-
const_castのつかいどころを教...
-
C++にてtemplateで受け取った任...
-
既定のコンストラクタがありま...
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
C# KeyDownイベントでショート...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
gcc: incompatible pointer type
-
_beginthreadにて発生するコン...
-
C#でラジオボタンを設定に記録...
-
C#でテンキーの操作は可能でし...
-
C++別のオブジェクトからメンバ...
-
CTabCtrl:TABインデックス単位...
-
見た目は同じソースなのにエラ...
-
pictureboxの画像を削除するには?
-
【VC++6.0】イベントハンドラ関...
おすすめ情報