Qaupot Blog
Software Engineering, Trip

206. 위임 생성자

🕐 Sat, 08 Mar 2014 09:00:00 GMT 🕓 Tue, 31 Aug 2021 10:11:00 GMT

위임 생성자 (Delegating Constructor)

위임 생성자를 하나의 클래스 내에서 비슷한 기능의 생성자가 필요한 경우 사용할 수 있습니다.

예를 들어, 범용 좌표 클래스를 디자인 한다고 합시다. 1차원 좌표 생성자, 2차원 좌표 생성자, 3차원 좌표 생성자 등이 필요하지만, 3차원 좌표 생성자는 2차원 좌표 생성자의 기능을 포함하고 2차원은 1차원의 기능을 포함합니다.

#include <iostream>

class Coordinate
{
public:
    int w, x, y, z;

    Coordinate(int w) 
    { 
        printf("Call 1D\n"); 
        this->w = w;
    }
    Coordinate(int w, int x) : Coordinate(w)
    { 
        printf("Call 2D\n");
        this->x = x; 
    }
    Coordinate(int w, int x, int y) : Coordinate(w,x) 
    { 
        printf("Call 3D\n");
        this->y = y;
    }
    Coordinate(int w, int x, int y, int z) : Coordinate(w, x, y)
    {
        printf("Call 4D\n");
        this->z = z; 
    }
};

int main(int argc, char** argv)
{
    Coordinate c(1, 2, 3, 4);
}
Call 1D
Call 2D
Call 3D
Call 4D

각 멤버 변수를 초기화 할 때 처럼, 생성자 뒤에 :을 붙이고 다른 생성자를 호출할 수 있습니다.

인스턴스 c를 생성할때 최초로 인수 4개인 생성자가 호출되면서, 인수 3개의 생성자를 호출합니다.
이후 연쇄 호출되어 인수 1개의 생성자까지 호출된 후 인수 1개의 생성자부터 역순으로 처리됩니다.

위임 생성자는 다른 멤버 변수를 초기화 할 수 없습니다. 따라서 아래와 같은 코드는 허용되지 않습니다.

Coordinate(int w, int x, int y) : Coordinate(w,x) , y(y)
이 블로그는 개인 블로그입니다. 게시글은 오류를 포함하고 있을 수 있지만, 저자는 오류를 해결하기 위해 노력하고 있습니다.
게시글에 별도의 고지가 없는 경우, 크리에이티브 커먼즈 저작자표시-비영리-변경금지 4.0 라이선스를 따릅니다.

This blog is personal blog. published posts may contain some errors, but author doing efforts to clear errors.
If post have not notice of license, it under creative commons Attribution-NonCommercial-NoDerivatives 4.0.