Computer >> Máy Tính >  >> Lập trình >> C ++

Làm thế nào để tạo một lớp C ++ mà các đối tượng chỉ có thể được cấp phát động?

Trong bài toán này, chúng ta sẽ xem cách chúng ta có thể tạo một lớp mà chúng ta chỉ có thể tạo các đối tượng thông qua cấp phát bộ nhớ động, không cho phép tạo đối tượng trực tiếp.

Ý tưởng là đơn giản. Chúng ta phải tạo hàm hủy riêng cho lớp đó. Khi trình hủy là riêng tư, trình biên dịch sẽ tạo ra lỗi trình biên dịch cho các đối tượng không được cấp phát động vì trình biên dịch cần xóa chúng khỏi phân đoạn ngăn xếp khi chúng không có sẵn để sử dụng. Đối với các đối tượng được cấp phát động, lập trình viên chịu trách nhiệm xóa đối tượng, nhưng trình biên dịch không chịu trách nhiệm về việc đó, vì vậy nó cho phép tạo các đối tượng động.

Để tránh rò rỉ bộ nhớ, chúng tôi sẽ sử dụng một hàm friend có thể được gọi bởi người dùng trong lớp để hủy đối tượng.

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#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);
}

Đầu ra

Creating object
Destroyng NoDirectObjClass object
Destroyng object using friend

Nếu chúng ta cố gắng tạo đối tượng trực tiếp mà không sử dụng cấp phát bộ nhớ động, thì nó sẽ tạo ra kết quả như sau -

Ví dụ (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;
}

Đầu ra

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() {
         ^