在C++中,可以通過特定的技術手段來控制對象只能在堆(heap)或棧(stack)上創建。
只能在堆上創建對象的類
要實現這一點,我們需要阻止用戶直接實例化對象,而只能通過new操作符創建。
class HeapOnly {
public:static HeapOnly* create() {return new HeapOnly();}// 刪除拷貝構造函數和賦值運算符HeapOnly(const HeapOnly&) = delete;HeapOnly& operator=(const HeapOnly&) = delete;private:HeapOnly() {} // 構造函數私有化~HeapOnly() {} // 析構函數私有化
};
原理:
將構造函數和析構函數設為私有,防止直接實例化
提供靜態工廠方法create()來創建對象
刪除拷貝構造函數和賦值運算符防止復制
只能在棧上創建對象的類
要實現這一點,我們需要阻止用戶使用new操作符創建對象。
class StackOnly {
public:StackOnly() {}/ 禁止普通的 new 和 deletevoid* operator new(size_t) = delete;void operator delete(void*) = delete;// 禁止 new[] 和 delete[]void* operator new[](size_t) = delete;void operator delete[](void*) = delete;// 禁止 placement new(防止繞過限制)void* operator new(size_t, void*) = delete;
};
原理:
刪除new和delete操作符的重載,使得無法使用new創建對象
仍然允許在棧上直接實例化對象
注意事項
對于只能在堆上創建的類,需要提供某種方式來釋放內存,通常是在類中添加一個destroy()方法:
void destroy() {delete this; }
這些技術在現代C++中可以通過=delete語法簡潔地實現,但在舊版C++中需要通過聲明為private并不實現的方式達到類似效果。
這些限制會影響類的使用方式,在設計時需要權衡靈活性和約束。