C++でゲームを作ろうと思いますが、オブジェクト指向についてよく分からないところがあります。
カプセル化を意識してプログラミングをしようと思いますが、悩んでいることがあります。
MapクラスとPlayerクラスがあるとします。
マップの状態を見て、移動可能ならプレイヤーを移動させる
という処理がしたい場合にどうしたら最適かどうかです。
Playerクラスの移動関数の引数に、Mapクラスのオブジェクトのアドレスを渡す方法を考えましたが
カプセル化っぽくなるとは思うのですがPlayerクラスにMapクラスのヘッダをインクルードしないといけないので大規模になるとエラーの元になりそうなので
悩んでいます。
下記のようにオブジェクトを生成したスコープ内で別々に処理をするという方法とどちらがいいのか悩んでいます。
説明下手ですいませんが誰か考えをお聞かせください
環境はwindows7 64bit
コンパイラ vc++2010
オブジェクト指向について
Re: オブジェクト指向について
単純な例ですが、自分だったらこうします。
Player も Map も、仲介するための Position 構造体さえ知っていれば良いわけです。
Player も Map も、仲介するための Position 構造体さえ知っていれば良いわけです。
struct Position {
int x, y;
};
class Player {
public:
const Position& position() const
{
return position_;
}
private:
Position position_;
};
class Map {
public:
bool canMove(const Position& position) const
{
return (position.x > 0);
}
};
int main() {
Map map;
Player player;
if (map.canMove(player.position())) {
// 何かする
}
return 0;
}
-
- 記事: 51
- 登録日時: 11年前
Re: オブジェクト指向について
h2so5さん回答ありがとうございます
なるほど、そういう考え方がありましたか
今思いつきましたが、MapクラスのcanMoveの引数を(int x,int y)にして、
実引数に(player.get_x, player.get_y)とかはどうですかね
これならヘッダをインクルードする必要がなくなると思うのですが
他にもいろいろな回答待っています
なるほど、そういう考え方がありましたか
今思いつきましたが、MapクラスのcanMoveの引数を(int x,int y)にして、
実引数に(player.get_x, player.get_y)とかはどうですかね
これならヘッダをインクルードする必要がなくなると思うのですが
他にもいろいろな回答待っています
Re: オブジェクト指向について
この例の場合はそれでも特に問題はないと思いますが、Positionに当たるクラスがもっと複雑なものだったりすると面倒ですし、AliceCoder さんが書きました: 今思いつきましたが、MapクラスのcanMoveの引数を(int x,int y)にして、
実引数に(player.get_x, player.get_y)とかはどうですかね
これならヘッダをインクルードする必要がなくなると思うのですが
カプセル化という観点からもあまり良くないと思います。
クラスにしてしまえばオペレーターオーバーロードが使えるという利点もありますし。
闇雲にインクルードするのは確かに問題ですが、
Positionクラスが書かれているヘッダが Player や Map のヘッダをインクルードするとは考えにくく、
循環インクルードは発生しないのできちんとインクルードガードすれば危険は無いはずです。
-
- 記事: 51
- 登録日時: 11年前
Re: オブジェクト指向について
h2so5さん回答再びありがとうございます
すいません書き間違えました
実引数のとこは、(player.get_x(), player.get_y())でアクセサのつもりでした。
なるほど、確かに複雑になってくると値渡しがめんどうになってきますね
次つくるときは経由用の構造体などを作ってみます
他の人の回答もいまだ受付中です。
明日ぐらいになったら解決にするつもりです
すいません書き間違えました
実引数のとこは、(player.get_x(), player.get_y())でアクセサのつもりでした。
なるほど、確かに複雑になってくると値渡しがめんどうになってきますね
次つくるときは経由用の構造体などを作ってみます
他の人の回答もいまだ受付中です。
明日ぐらいになったら解決にするつもりです
Re: オブジェクト指向について
ですが、クラスの実体をメンバや引数に取る場合はincludeが必要ですし、クラスBのメンバ関数をA.hで使用したい時にもまた必要です。
-
- 記事: 51
- 登録日時: 11年前
Re: オブジェクト指向について
涼雅さん分かりやすく教えてくださりありがとうございます
こういうやり方もあったんですね
勉強になりました
こういうやり方もあったんですね
勉強になりました