Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

개체를 동적으로 할당할 수만 있는 C++ 클래스를 만드는 방법은 무엇입니까?

<시간/>

이 문제에서 우리는 동적 메모리 할당을 통해서만 객체를 생성할 수 있고 직접적인 객체 생성은 허용되지 않는 하나의 클래스를 만드는 방법을 볼 것입니다.

아이디어는 간단합니다. 해당 클래스에 대한 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() {
         ^