- delete 를 외부에서 호출할 수 없게 하는 기술
- 객체를 힙영역에만 생성하게 하는 기술이다.
객체의 소멸자를 protected 영역에 둠으로써, 위 2가지를 가능하게 만든다. 코드를 통해서 살펴보자.
#include <iostream>
#include <algorithm>
class Book
{
public:
Book() = default;
~Book() = default;
void DeleteBook()
{
delete this;
}
private:
int page {0};
};
int main()
{
Book *myBook= new Book;
Book *myBook2 = new Book;
Book book ; // not want to allow declaration of local variables
delete myBook2;// not want to delete from outside.
myBook->DeleteBook();
return 0;
}
위와 같이 책을 관리하는 간단한 class 를 만들었다고 가정하자.
이걸 개발한 나는 이 객체를 지역변수로 하고 싶지 않고, 또 외부에서 delete 를 하게 하고 싶지 않다.
이런 것을 가능하게 하려면 아래와 같이 소멸자를 protected 영역으로 두게 하면 된다.
class Book
{
public:
Book() = default;
void DeleteBook()
{
delete this;
}
private:
int page {0};
protected :
~Book() = default;
};
원리는 간단하다. 지역변수의 경우 block 을 벗어나는 경우 반드시 소멸자를 호출해야한다.
컴파일러는 그렇기 때문에 컴파일 과정에서 지역변수가 block을 벗어날때 소멸자를 call 하도록 컴파일한다.
그런데 컴파일 과정에서 소멸자가 protected 영역에 있는것을 발견한다? 이때는 당연히 에러를 내게 한다.
같은 원리로 외부에서 delete 를 호출하게 하려면 반드시 소멸자가 호출되어야하는데 이 소멸자 역시 protected 영역에 있으므로 컴파일 에러가 된다.
사용하는 이유
위 예제에서는 간단한 예제라 크게 와닿지는 않지만 내가 만든 객체가 아주 중요해서 내부적으로 참조계수를 관리하거나 혹은 중요한 메모리 관리를 해야 할 수 있다. 이런 경우에 쓰일 수 있다.
알아두면 오픈소스 등 cpp코드 읽을 때 도움이 될 거 같다.
'Study > CPP' 카테고리의 다른 글
| class template deduction guide (0) | 2024.03.06 |
|---|---|
| Enum class to type ( int2Type 의 응용) (0) | 2022.11.02 |
| EnumClassToType (0) | 2022.09.12 |