10.2 구성관계 composition
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는 몬스터 클래스에 대해 알 필요가 없다.