class Dot {
public:
int x, y;
Dot() {}
Dot(int x_, int y_) {
x = x_;
y = y_;
}
Dot operator = (Dot t) {
x = t.x;
y = t.y;
return { x, y };
}
};
class LineSegment {
public:
Dot d1, d2;
LineSegment(Dot dot1, Dot dot2) {
d1 = dot1;
d2 = dot2;
}
LineSegment(int x1, int y1, int x2, int y2) {
LineSegment(Dot(x1, y1), Dot(x2, y2));
}
};
이렇게 작성하고 LineSegment(int x1, int y1, int x2, int y2) 생성자 호출 시 Dot d1, d2가 제대로 초기화 되지 않는다.
동일한 클래스 내 다른 생성자인 LineSegment(Dot(x1, y), Dot(x2, y2))를 호출하지만, 그 생성자가 만든 객체의 내용이 현재 객체에 반영되는 건 아니니까.
적고 보니 너무 당연한 얘기다.
이를 해결하는 방법이 두 가지 있는데
LineSegment(int x1, int y1, int x2, int y2) { *this = LineSegment(Dot(x1, y1), Dot(x2, y2)); }
이렇게 새로운 생성자가 만든 객체를 취하거나
LineSegment(int x1, int y1, int x2, int y2) : d1(Dot(x1, y1)), d2(Dot(x2, y2)) {}
이렇게 현재 객체의 Dot d1, d2 변수를 초기화해주면 된다.
후자의 방법이 더 좋은 거 같다.