循環参照?の解決方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
タンタル

循環参照?の解決方法

#1

投稿記事 by タンタル » 9年前

現在作っているゲームで少し困ったことが起きましたので、こちらで質問させていただきます。

コード:

    this->player = new Player(this->shockWaveManage,this->numericalBarManage,this->bombManage);
	this->barrageManage = new BarrageManage(this->bulletManage,this->player);
	this->board = new Board(this->player);
	this->enemyManage = new EnemyManage(this->barrageManage,this->itemManage,this->player);
	this->shockWaveManage = new ShockWaveManage(this->enemyManage);

上記のコードではplayerがshockWaveManageを必要としていて、shockWaveManageはenemyManageを必要としていて、enemyManageはplayerを必要としている、というように循環しています。
この場合、playerからshockWaveManageを呼び出そうとすると、メモリのアクセス違反エラーが出て終了します。

どのようにしたら解決できるのでしょうか。もしくは解決の参考になりそうなサイトやキーワードを教えていただけたら幸いです。
どこまでコードを乗せるべきかわからなかったため、質問ができる最低限の量しか載せていませんので、お手数ですが足りない部分があれば教えてください。
申し訳ありませんが、よろしくお願いします。

アバター
spaaaark・∀・
記事: 66
登録日時: 10年前
住所: 埼玉
連絡を取る:

Re: 循環参照?の解決方法

#2

投稿記事 by spaaaark・∀・ » 9年前

うーん…構造的な問題が少し気になる所ですが、ひとまず解決する方法として有効なのは
その処理で必要なデータをメンバ関数の引数にしてしまうこと、でしょうか。
こうすることによってそれぞれが独立した状態でインスタンスを作ることができます。

初期化処理に必要な場合も同様です。ただコンストラクタで初期化するんじゃなくて、
初期化用の関数を作り、それを呼び出した方がいいと思います。

あと、ヘッダーファイルをそのままインクルードするのではなく、実体アクセス以外なら先に
クラス名のみを宣言して、cppでそのソースコードを読み込むことが可能です。

コード:

/* 1.h */
#pragma once
class Fuga; // 先方宣言

class Hoge{
  /* 動作を書き込み */
public:
  bool Init(Fuga& p_Data); // 例1
};


/* 2.h */
#pragma once
class Hoge; // 先方宣言

class Fuga{
  /* 動作を書き込み */
public:
  bool Init(Hoge* p_pData); // 例2
};

// cppファイルではそれぞれのヘッダーファイルを読み込む
クリエイティブな生活で刺激的な毎日を!

タンタル

Re: 循環参照?の解決方法

#3

投稿記事 by タンタル » 9年前

spaaaark・∀・さん、ご回答ありがとうございます。そしてお礼が遅くなり申し訳ありません。

言われてみればその通りですね...
spaaaark・∀・さんのおっしゃる通り、初期化関数でポインタを引数に渡してみようと思います。とても助かりました、ありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る