他クラスから値をもらいたい時の最適解

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Iseuma14
記事: 54
登録日時: 10年前

他クラスから値をもらいたい時の最適解

#1

投稿記事 by Iseuma14 » 9年前

いつもお世話になっております
C++で、他クラスから値を引っ張ってきたいときの綺麗な書き方を知りたいです

現在、龍神録の館を参考に自分のC++でコードを書く練習も兼ねてプログラム自分なりにC++で組ませていただいております
現在、13章の敵弾の発射についてを勉強しているのですが、
13章は自機狙い弾や、どの敵が弾を撃ったか等の他クラスからメンバ変数を引っ張ってきたり、
それを別のクラスのメンバ変数に代入したりと何かと他クラスからメンバ変数を持ってくる場面が多いです

現在自分は各クラスに必要な値を戻り値として返すメンバ関数を作って対応していますが、
例えば、龍神録の館13章内の
//1発だけ、自機に向かって直線移動
の部分は、自分の設計ではshotクラスのメンバ変数のbulletクラス(本来は構造体にするべきなのかもしれませんが、画像の部分を静的メンバ変数にして各クラスで共有したほうがメモリの節約になると考え、クラスにしました)の中のメンバ変数kindにenemyクラスのメンバ変数であるblkind2を代入する形になっており、これをshotクラスのメンバ関数で行っているため、これとは別にbulletクラスに、enemyクラスからの数値を受け取りkindに入れるメンバ関数を、enemyクラスに自分のblkind2を返すメンバ関数を作る必要が出てきてしまいます

自分で実装してみた所とても汚く、もう少し綺麗に書く方法があるのではないかと考え、質問させていただきました
これ以外に自分の考えた方法として、フレンドクラスにするなどもありましたが、カプセル化できているいいコードにはならなそうなので現在の方法で実装しております

もっと綺麗に書く方法があるなら教えていただきたいです
何卒、よろしくお願いします
最後に編集したユーザー Iseuma14 on 2016年6月09日(木) 12:45 [ 編集 1 回目 ]

hide

Re: 他クラスから値をもらいたい時の最適解

#2

投稿記事 by hide » 9年前

shotクラスのメンバ変数のbulletクラス
この構造だと、敵が倒された時shotとともにbulletも消えそうですね。
一般的にメンバ変数は強い関係性になるのであまり良くないかもしれません。
これは意図したものですか?
enemyクラスのから数値を受け取りkindに入れるメンバ関数を、enemyクラスに自分のblkind2を返すメンバ関数を
Enemyが弾の種類の情報を直接持つ必要はないでしょう。
弾の種類が何であるかの情報はshotの役割かと思います。
弾が何であるかに関わらず、敵が弾を撃つ時に
その敵のshotが新しく弾を生成するだけで済むのが理想です。

http://qiita.com/toRisouP/items/824aff814849ae41efe7
Rxが利用されててわかりづらいかもしれませんが
綺麗な形かと思うので参考にどうぞ

Iseuma14
記事: 54
登録日時: 10年前

Re: 他クラスから値をもらいたい時の最適解

#3

投稿記事 by Iseuma14 » 9年前

>>hide様、ご回答ありがとうございます
この構造だと、敵が倒された時shotとともにbulletも消えそうですね。
一般的にメンバ変数は強い関係性になるのであまり良くないかもしれません。
これは意図したものですか?
これにつきましては自分としては、龍神録の館でdixq様が行っているように
敵が倒されたらshotをこれ以上弾を出さないフラグに変更するもので対応できると
思っていたのですが、クラスだった場合それに関して不都合があるのでしょうか?
自分はまだC++での実践的なプログラム経験が薄く、手本を見てそれをクラスを使って書いてみる
ような感じですので、意図したものではございません
いろいろお聞きしたいのですが、私の始めの質問とは主題がズレてしまい、統一性がなくなるため、困った場合は再び、別の質問を立てさせていただきます 申し訳ございません
Enemyが弾の種類の情報を直接持つ必要はないでしょう。
弾の種類が何であるかの情報はshotの役割かと思います。
弾が何であるかに関わらず、敵が弾を撃つ時に
その敵のshotが新しく弾を生成するだけで済むのが理想です。
こちらにつきましても恥ずかしながら自分で考えながらプログラムを書いている段階ではないので、
龍神録の内容をほぼそのまま、あるべき構造を考えずにクラスにした結果でございます
これからは自分なりに考えて、機能をしっかり分けていこうと思います

長くなってしまい申し訳ございません
主題の質問ですが、私の文章力が無かったせいでしっかりとお伝えできませんでした
申し訳ございません 少し例を交えながら書かせていただきます

例えば、私が質問で書いた例をイメージで書くと、
shotクラスのメンバ関数の中で、

コード:

//shot.cpp
shot[n].bullet[k]./*bulletに弾の種類を入れる関数*/ = enemy[shot[n].num]./*自分のblkind2を返す関数*/;
という感じになり、物凄く書き方が汚い感じがしてもっと他の方法が実はあるのではないか
とおもい、質問させていただいた次第でした わかりにくく、本当に申し訳ございません
お暇でしたら、またお答えいただけると嬉しいです

hide

Re: 他クラスから値をもらいたい時の最適解

#4

投稿記事 by hide » 9年前

構造が良くないからコードが汚くなるんじゃないかなと思います。
shotクラスのメンバ関数の処理なのにshotが配列なのも謎ですし
enemyクラスがshotクラスがのオブジェクトをもつならば
enemyクラスを直接参照しているのもおかしいように思います。

銃が弾を発射するときにいちいち持ち主に
ライフル弾を撃つのかミサイルを撃つのかを
持ち主に聞きに行くのは変ではないですか?

まぁどんな設計なのか私は知る由もないので絶対ではないです。

Iseuma14
記事: 54
登録日時: 10年前

Re: 他クラスから値をもらいたい時の最適解

#5

投稿記事 by Iseuma14 » 9年前

>>hide様
構造が良くないからコードが汚くなるんじゃないかなと思います。
shotクラスのメンバ関数の処理なのにshotが配列なのも謎ですし
enemyクラスがshotクラスがのオブジェクトをもつならば
enemyクラスを直接参照しているのもおかしいように思います。

銃が弾を発射するときにいちいち持ち主に
ライフル弾を撃つのかミサイルを撃つのかを
持ち主に聞きに行くのは変ではないですか?

まぁどんな設計なのか私は知る由もないので絶対ではないです。
なるほど、確かに御尤もでございます
C++のサイトで一通り勉強しただけなので、コーディング力がまだまだ足りないようです
今回のこの問題はもう少し簡単なプログラムでコーディングについて学んで、慣れてきたらまた戻ってきたいと思います

ところで、C++について教えてくれるサイトはいっぱい見つかるのですが、
今回問題となったコーディングについて解説しているサイトをなかなか見つけることができません
C++ コーディング等で調べても上級者向けのリファクタリングについてのサイトが多く出てきます
(私の検索の仕方が下手すぎるだけかもしれませんが)
何度も申し訳ない限りなのですが、もしC++のコーディングについて解説してくれているサイトや書籍をご存知でしたらお教えいただけないでしょうか

何度もお手数おかけして申し訳ございません

hide

Re: 他クラスから値をもらいたい時の最適解

#6

投稿記事 by hide » 9年前

龍神録プログラミングの館を久しぶりに覗きました。
もしかして、龍神録プログラミングの館のファイルと1対1になるようにクラスをつくってたりしますか?
もしそうだとしたら、その書き方はやめたほうがいいです。
クラスがどうのと最初から書いていらっしゃるのであまり気にしていませんでしたが、
C++で学んだのは文法のみということでしょうか?

そうなのだとしたら、一度そのプログラムを書くことをやめて、
オブジェクト指向やクラスの設計などを学ぶのをお勧めします。

Iseuma14
記事: 54
登録日時: 10年前

Re: 他クラスから値をもらいたい時の最適解

#7

投稿記事 by Iseuma14 » 9年前

>>hide様
まさしくその通りでございます 一通り入門サイトで文法を学んだのみで、
C++でのコーディングはまだまだ勉強不足といった状態でした

アドバイスいただきましたようにクラスの設計やC++でするべき組み方を学んでから出直させていただこうと思います

何度もご指導ありがとうございました

閉鎖

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