質問: C++で同じ内容のクラスをまとめたい。 以下のプログラムのように、同じ内容を持つ構造体を一つにまとめる良い方法が知りたいです。
回答: >以下のプログラムのように、同じ内容を持つ構造体を一つにまとめる良い方法が知りたいです。(SatouPlayer、SatouAlly、SatouEnemyやSuzuki~) が、何をしたいのか、わからないです。m(;_ _)m 質問文に書かれたコードざっと拝見して、気づいたことだけ。 1. 公開派生(Is-A)なら、virtual なデストラクタ必要。 でないと、見かけの型が基底で破棄(delete)したとき、派生型のデストラクタが動きません。 2. この例だと、Character は完全な抽象型(UMLでいう《interface》)にすべきな気がします。 空っぽなデフォルト実装 {} があるので、言語的には Character は完全具象型であり、インスタンス化可能。 書かれたコードに、上記観点でじゃっかん加筆したもの。 興味があれば、あれこれ試してみてください。 P.S. Charcter はスペルミス英単語では? と思えたので、Character に 変えさせていただきました。 #include struct Character { ___ virtual ~Character() {} // placeholder for derived class ___ virtual void Move() = 0; ___ virtual void Attack() = 0; }; //操縦者////////////////////////////////////////////////// struct Player : Character { ___ void Move() { ___ ___ printf("プレイヤー移動\n"); ___ } }; struct Ally : Character { ___ void Move() { ___ ___ printf("味方移動\n"); ___ } }; struct Enemy : Character { ___ void Move() { ___ ___ printf("エネミー移動\n"); ___ } }; //佐藤////////////////////////////////////////////////// struct SatouPlayer : Player { ___ void Attack() { ___ ___ printf("佐藤アタック\n"); ___ } }; struct SatouAlly : Ally { ___ void Attack() { ___ ___ printf("佐藤アタック\n"); ___ } }; struct SatouEnemy : Enemy { ___ void Attack() { ___ ___ printf("佐藤アタック\n"); ___ } }; //鈴木////////////////////////////////////////////////// struct SuzukiPlayer : Player { ___ void Attack() { ___ ___ printf("鈴木アタック\n"); ___ } ___ ~SuzukiPlayer() { printf("SuzukiPlayer destroyed.\n"); } }; struct SuzukiAlly : Ally { ___ void Attack() { ___ ___ printf("鈴木アタック\n"); ___ } }; struct SuzukiEnemy : Enemy { ___ void Attack() { ___ ___ printf("鈴木アタック\n"); ___ } }; int main() { // void main() は言語規格にはないもの、int main()とすべき。 #if 0 ___ Player* player = new SuzukiPlayer; ___ player->Move(); ___ player->Attack(); ___ delete player; #else ___ // C++のポリモーフィズムは、ポインタ or 参照 を介したときしか、動かない。 ___ // 逆にいえば、この条件さえ満たせば、new は必然ではない。 ___ { ___ SuzukiPlayer suzuki; ___ Player& player = suzuki; ___ player.Move(); ___ player.Attack(); ___ } // suzuki destoroyed. #endif ___ return 0; }