如何定义一个只能在堆上或栈上生成对象的类
在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并不实现的方式达到类似效果。
这些限制会影响类的使用方式,在设计时需要权衡灵活性和约束。