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