C言語でいう構造体とかJavaとかでいうクラスのオブジェクトって、
基本的には staticじゃないから、同じクラスから生成していても、
Java
1
2public class Test{
3 public method1(){ Test2 t = new Test2(); }
4 public method2(){ Test2 t = new Test2(); }
5}
6
7public Test2{
8 ... 何らかのメンバ ( メソッドやフィールド )
9}
10
だと method1と method2 にあるt は別物です。
int型のローカル変数と同じです。
これのクラスレベルじゃないかなと。
Player_Dataクラスを見ると Playerクラスをコンポジションしているけど、
これだと、例えば yusha( 勇者 ), wizard ( 魔法使い )... とあったとき、
yushaは yusha用の Player playerにアクセスします。
よって、全体のやつには反映されない。
クラスって"ある意味" 変数と一緒。
単なる型。
だから複数個作れますよね。
同じクラスから作れば(持っているデータも)共通しているなら、意味がない。
逆にめんどくさくなるし。
勇者用にYushaクラス, Wizardクラス...って少しでも違えばクラスを生成しないといけなくなる。
[返信1]
変数で考えてみてください。
Java
1int method1(){
2 int a;
3 a = 100;
4}
5
6int method2(){
7 int a;
8 a = 32;
9}
10
さて、上記の場合、int a はそれぞれ同じものでしょうか?
実際には method1はmethod1内にあるint aを, method2は method2内にある int aを参照します。
よって、別物になります。
これのオブジェクト版。
なので、例えばmainメソッド内で、
Java
1Player player1 = new Player( "player1" );
2Player enemy1 = new Player( "ememy1" );
3CharaManager manager = new CharaManager();
4
5manager.add( palyer1 );
6manager.add( enemy1 );
7
みたいになると思う。
この一つのmanagerがListを持っていて、管理する...みたいな。
あと、基本的にオブジェクト指向の言語はフィールドはprivateです。
そうじゃないとC言語でいうグローバル変数と同じになってしまいますから。
で、そのアクセスはアクセサと呼ばれるget/setで。
C# なら プロパティって呼ばれるもの。
Listを持つのは一つに限定したほうがいいはず。
( 複数個あってもいいが、完全に独立しているから今回は不向き。 )
[ 返信2 ]
えーと、返信1 で挙がっているmanager をC++で書くと
C++
1class PlayerManager{
2 public:
3 void add( Player *player ){ players.push_back( player ); }
4 ... // その他メンバ
5 private:
6 List<Player> players;
7};
みたいに持っていて、管理者として存在します。
別にこれはなくてもいいですが、あくまで考え方。
返信にある ( 20になった... ) のコードでは
main関数で player が生成されていますね。
このplayerオブジェクトが持つので player::x には 20が入っている。
が、これを別のクラスや関数でさらに生成して使用しても player自体がまったく違う物質になっていますから、もっているデータも違ってくる。
同じ"太郎"でも山田太郎と東京太郎では違いますよね。
それと同じです。
最初の質問では、流れを考えるといいと思います。
まず、
Playerのほうで生成するとしても、player_dataを生成 -> player_data::Set_Parameterで設定 -> ( Set_Parameterの呼び出し ) -> Player playerが生成される -> Set_Parameterが動く ...
という感じで考えると、( Player_Data の方の ) Player player とかがわかりにくくなる。
というか、なぜこういう風に複雑にしたのかが疑問。
( 私が馬鹿なだけかもしれないが。 )
[ 返信3 ]
例えば、上記のPlayerManager クラスがあるとして、
C++
1void func( PlayerManager *manager ){
2 Player player; // プレイヤーを生成 ( 本来は引数が必要だと思うが、例なので省略 )
3 manger->add( player );
4}
5
みたいにしておけば、
C++
1// main関数内
2PlayerManager manager; // これも本当は引数が必要だろうけど、例なので省略。
3func( &manager );
みたいに管理者を渡せばOkだと思う。
オブジェクト指向だからって、複雑に捉えすぎると意味がわからなくなり、余計アレになる。
関係性をUMLとかで洗い出して考えてみては?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。