Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Tạo class C++ chỉ cho phép cấp phát động (dynamic allocation)

Để ép buộc đối tượng chỉ được tạo trên heap (bằng new), ta làm private destructor. Biên dịch sẽ báo lỗi nếu tạo đối tượng trên stack vì không thể gọi destructor khi ra khỏi scope.

Kỹ thuật

  • Đặt destructor private.
  • Cung cấp friend function để xóa đối tượng (tránh rò rỉ bộ nhớ).

Ví dụ

#include <iostream>
using namespace std;

class NoDirectObjClass {
private:
    ~NoDirectObjClass() {
        cout << "Destroying NoDirectObjClass object" << endl;
    }
public:
    NoDirectObjClass() {
        cout << "Creating object" << endl;
    }
    friend void friend_destructor(NoDirectObjClass*);
};

void friend_destructor(NoDirectObjClass* p) {
    delete p;
    cout << "Destroying object using friend" << endl;
}

int main() {
    NoDirectObjClass* p = new NoDirectObjClass; // OK
    friend_destructor(p);
    // NoDirectObjClass obj; // LỖI COMPILE: destructor private
    return 0;
}

Kết quả

Creating object
Destroying NoDirectObjClass object
Destroying object using friend

Nếu cố tạo trên stack

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

Ứng dụng: Singleton, pool allocator, quản trị vòng đời phức tạp.