10.2関係の構成

2764 ワード

構成関係とは?


:クラスを作成するときに、他のオブジェクトで次のコンポーネントを使用することもできます.
クラスを削除して、プライベートスペースに配置します.
例えば、ゲームにはゴブリンやスライムなどの怪物がいて、
座標を表すx,yの値をそれぞれPositionというクラスに配置する.
モンスターのクラスでは、プライベートメンバーに置いて部品の形で使用します.
継承類にすればいいのでしょうか?そう思います.
class Parent
{
	protected :
    int x;
    int y;
    virtual void Walk() = 0;
    
}
->そうなんだけど!!以下に整理した内容を参考に、関系のないモンスタータイプが现れたら、モンスターの中でメンバー変数を単独で整理する必要があります.
クラスを個別に作成するのは効率的で、構成関係と呼ばれます.
パーツを想像して納得!
https://velog.io/@kwt0124/%EC%88%9C%EC%88%98-%EA%B0%80%EC%83%81%ED%95%A8%EC%88%98



:ゴブリンの座標x,y,スライムも位置を表す座標があるはずです.共通の部分なので、部品として扱い、クラスとして作成し、メンバー変数として使用すると効率的です.
  • コードの変更

    :メンバー変数として使用するPositionクラスが作成されました.

  • 最終コード
  • #include <iostream>
    #include <vector>
    #include <string>
    using namespace std;
    
    class Position
    {
    private :
    	int mX;
    	int mY;
    public : 
    	Position(const int&inX, const int&inY)
    		: mX{ inX }, mY{inY}
    	{}
    	void SetPosition(const Position& InPos)
    	{
    		mX = InPos.mX;
    		mY = InPos.mY;
    	}
    	friend std::ostream & operator << (std::ostream & out, const Position & pos2d)
    	{
    		out << pos2d.mX << " " << pos2d.mY;
    		return out;
    	}
    };
    
    class Goblin
    {
    private :
    	string mName;
    	Position mLocation;
    public : 
    	Goblin(const string &inName, const Position&inPos)
    		:mLocation{ inPos }, mName{inName}
    	{}
    	void MoveTo(const Position &nextPos)
    	{
    		mLocation.SetPosition(nextPos);
    	}
    	friend std::ostream &operator << (std::ostream &out, const Goblin &gob)
    	{
    		out << gob.mName << " " << gob.mLocation;
    		return out;
    	}
    };
    
    int main()
    {
    	Goblin gob("고블린", Position(4,0));
    	cout << gob << endl;
    
    	{
    		gob.MoveTo(Position(1, 1));
    		cout << gob << endl;
    	}
    }