이 문제에서 우리는 동적 메모리 할당을 통해서만 객체를 생성할 수 있고 직접적인 객체 생성은 허용되지 않는 하나의 클래스를 만드는 방법을 볼 것입니다.
아이디어는 간단합니다. 해당 클래스에 대한 private 소멸자를 생성해야 합니다. 소멸자가 private일 때 컴파일러는 동적 할당되지 않은 개체에 대해 컴파일러 오류를 생성합니다. 컴파일러는 사용할 수 없게 되면 스택 세그먼트에서 개체를 제거해야 하기 때문입니다. 동적으로 할당된 객체의 경우 프로그래머는 객체를 삭제할 책임이 있지만 컴파일러는 이에 대한 책임이 없으므로 객체를 동적으로 생성할 수 있습니다.
메모리 누수를 피하기 위해 클래스의 사용자가 객체를 파괴하기 위해 호출할 수 있는 friend 함수를 사용할 것입니다.
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include<iostream> using namespace std; class NoDirectObjClass { private: ~NoDirectObjClass() { cout << "Destroyng NoDirectObjClass object" << endl; } public: NoDirectObjClass() { cout << "Creating object" << endl; } friend void friend_destructor(NoDirectObjClass* ); }; void friend_destructor(NoDirectObjClass* p) { delete p; cout << "Destroyng object using friend" << endl; } int main(){ NoDirectObjClass *p = new NoDirectObjClass; friend_destructor(p); }
출력
Creating object Destroyng NoDirectObjClass object Destroyng object using friend
동적 메모리 할당을 사용하지 않고 객체를 직접 만들려고 하면 다음과 같이 출력이 생성됩니다. -
예시(C++)
#include<iostream> using namespace std; class NoDirectObjClass { private: ~NoDirectObjClass() { cout << "Destroyng NoDirectObjClass object" << endl; } public: NoDirectObjClass() { cout << "Creating object" << endl; } friend void friend_destructor(NoDirectObjClass* ); }; void friend_destructor(NoDirectObjClass* p) { delete p; cout << "Destroyng object using friend" << endl; } int main(){ NoDirectObjClass t1; }
출력
main.cpp: In function ‘int main()’: main.cpp:22:22: error: ‘NoDirectObjClass::~NoDirectObjClass()’ is private within this context NoDirectObjClass t1; ^~ main.cpp:6:9: note: declared private here ~NoDirectObjClass() { ^