Pattern/C++

[C++] Protected 생성자, 소멸자의 사용 방법

dpswlsldj 2021. 3. 20. 10:44
728x90

Protected 생성자에 접근하는 방법

직접 객체 생성 시 Protected 생성자에 접근할 수 없어 에러가 발생합니다.

 

하지만 Projected 생성자를 갖는 class를 상속한 Public 생성자를 갖는 class에서는 접근이 가능하게 됩니다.

#include <iostream>

using namespace std;

class Car
{
protected:
    Car() {
        cout << "this is a car" << endl;
    }
};

class Bus : public Car
{
public:
    Bus() {
        cout << "this is a bus" << endl;
    }
};

int main()
{
    // Car car; // 접근 실패
    Bus bus; // 접근 가능
}

위의 소스에서 bus 생성 시 Bus 클래스가 호출되게 되고 Bus는 자신의 생성자를 호출하기 전에 상속받는 Car의 생성자를 먼저 호출하게 됩니다.

 

따라서 실행 결과는 아래와 같습니다.

this is a car
this ia a bus

Protected 소멸자에 접근하는 방법

객체를 stack에 못 만들게 하고 heap에 만들게 할 때 사용하는 스킬입니다.

 

stack에 만든다면 선언된 block을 벗어날 때 소멸자를 호출해야 하는데 protected 소멸자를 호출하지 못하여 에러가 발생합니다.

 

참조계수 기반의 객체의 라이프사이클 관리에 주로 사용됩니다.

#include <iostream>

using namespace std;

class Car
{
public:
    Car() {
        cout << "this is a car" << endl;
    }

    void destroy() {
        delete this;
    }
protected:
    ~Car()
    {
        cout << "destroy a car" << endl;
    }
};

int main()
{
    // Car car; // 소멸자에 접근할 수 없으므로 stack에 객체를 만들 수 없음
    Car* car = new Car; // heap에는 만들 수 있음
    // delete p; // 만들었지만 소멸자에 접근할 수 없음
    car->destroy(); // 우회하여 소멸자를 호출함
}