monster header

#pragma once
#include <string>
#include "Position2D.h"

class Monster
{
private:
    std::string m_name;
    Position2D m_location;
    //int m_x;
    //int m_y; // 몬스터 위치
    
public:
    Monster(const std::string name_in, const Position2D & pos_in)
        : m_name(name_in), m_location(pos_in)
    {}
    
    void moveTo(const Position2D & pos_target)
    {
        m_location.set(pos_target);
        //m_x = x_target;
        //m_y = y_target;
    }
    
    friend std::ostream & operator << (std::ostream & out, const Monster & monster)
    {
        //out << monster.m_name << " " << monster.m_x << " " << monster.m_y << "\n";
        out << monster.m_name << " " << monster.m_location;
        return out
    }
    
};

position header

#pragma once
#include <iostream>

class Position2D
{
private:
    int m_x;
    int m_y;
    
public:
    Position2D(const int & x_in, const int & y_in)
        : m_x(x_in), m_y(y_in)
    {}
    
    void set(const Poisition2D & pos_target)
    {
        set(pos_target.m_x, pos_target.m_y);
        // m_x = pos_target.m_x; 아래 함수를 재활용하는게 좋다.
        // m_y = pos_target.m_y;
    }
    
    
    void set(const int & x_target, const int & y_target)
    {
        m_x = x_target;
        m_y = y_target;
    }
    
    friend std::ostream & operator << (std::ostream & out, const Position2D & pos2d)
    {
        out << Position2D.m_x << " " << Position2D.m_y;
        return out
    }
    
}

main file

#include "Monster.h"

using namespace std;

int main()
{
	//Monster mon1("Sanson", 0, 0);
    Monster mon1("Sanson", Position2D(0,0));
    
    mon1.m_location
    
    cout << mon1 << "\n";
    
    while(1) // game loop
    {
        //event
        mon1.moveTo(Position2D(1, 1));
        cout << mon1 << "\n";
    }
    
    return 0;
}

이제 Postion2D 클래스에 +, - 오퍼레이터도 오버로딩 하고 다양한 작업들을 할 수 있을텐데 만약 이것들을 몬스터클래스에 하게 된다면 나중에 워리어 클래스나 등에 활용할 수 없게 된다. 이 때, 몬스터 클래스가 포지션2D 클래스를 사용하는 관계를 컴포지션 관계라고 한다.

구성(요소) :

  • 관계를 표현하는 동사 : Part-of

  • 관계의 형태 : 전체/부품

  • 다른 클래스에도 속할 수 있는가? No. Position2D 자체는 다른데에도 재사용이 되지만, 몬스터 클래스에 들어있는 m_location 자체는 다른 클래스에서 쓸 일이 없다. 그 몬스터의 위치만 나타내기 때문.

  • 멤버의 존재를 클래스가 관리? : Yes. 몬스터가 죽으면 몬스터 클래스의 m_location은 몬스터가 죽으면서 같이 사라짐.

  • 방향성 : 단방향. postion2d는 몬스터 클래스에 대해 알 필요가 없다.