自分が書いているゲームのファイルパーサーを作成して、ゲームのさまざまな側面(キャラクター/ステージ/衝突データなど)を簡単に変更できるようにしました。たとえば、次のような文字クラスがあるとします。
class Character
{
public:
int x, y; // Character's location
Character* teammate;
}
C++に似た構文のデータ構造をファイルから読み込むようにパーサーを設定しました
Character Sidekick
{
X = 12
Y = 0
}
Character AwesomeDude
{
X = 10
Y = 50
Teammate = Sidekick
}
これにより、2つのデータ構造が作成され、マップに配置されます<std::string, Character*>
。ここで、キー文字列は、私が付けた名前(この場合はSidekickとAwesomeDude)です。私のパーサーがチームメイトポインターのようなクラスへのポインターを見ると、そのデータ構造へのポインターをフェッチするためにマップを検索するのに十分賢いです。問題は、Sidekickのチームメイトがまだキャラクターマップに配置されていないため、AwesomeDudeであると宣言できないことです。
マップにまだ追加されていないオブジェクトをデータ構造で参照できるように、これを解決するための最良の方法を見つけようとしています。私が考えることができる2つの最も簡単な解決策は、(a)データ構造を前方宣言する機能を追加するか、(b)パーサーにファイルを2回読み取らせることです。1回目は空のデータ構造へのポインターをマップに入力し、2回目は通過し、それらを記入します。
(a)の問題は、クラスで呼び出すコンストラクターも決定できることです。前方宣言を行う場合は、コンストラクターを残りのデータから分離する必要があり、混乱を招く可能性があります。(b)の問題は、SidekickとAwesomeDudeをそれぞれのファイルで宣言したい場合があることです。パーサーが一度に1つだけではなく、読み取るファイルのリストを取得できるようにする必要があります(これはそれほど悪くはないと思いますが、読み取り先のファイルのリストを取得したい場合もあります。ファイル)。(b)コンストラクター自体で後で宣言されたデータ構造を使用できないという欠点もありますが、それは大したことではないと思います。
どちらの方法がより良いアプローチのように聞こえますか?私が考えていなかった3番目のオプションはありますか?ポインタ参照やバインディングなどを使用して、これに対する巧妙な解決策があるはずです...:-/これは、自分に提供したい機能に基づいてある程度主観的だと思いますが、どのような入力でも構いません。