设计只能在堆或者栈上创建的类
来源:互联网 发布:10.24是程序员什么日子 编辑:程序博客网 时间:2024/06/04 20:30
1,设计只能在堆上分配的类
方法:将类的构造函数或者析构函数设置为protected(private会限制继承),迫使类对象在栈的构造时编译出错,并提供destroy接口
- using namespace std;
- class OnlyHeap
- {
- public:
- OnlyHeap()
- {
- cout<<"construct"<<endl;
- }
- void distory () const
- {
- delete this;
- }
- protected:
- ~OnlyHeap()
- {
- cout<<"destruct"<<endl;
- }
- };
- int main()
- {
- //OnlyHeap OnlyHeap; //会报错
- OnlyHeap* o=new OnlyHeap;
- o->distory();
- return 0;
- }
OnlyHeap * hash_ptr = new OnlyHeap() ;
... ... //对hash_ptr指向的对象进行操作
hash_ptr->destroy() ;
呵呵,是不是觉得有点怪怪的,我们用new创建一个对象,却不是用delete去删除它,而是要用destroy方法。
很显然,用户是不习惯这种怪异的使用方式的。所以,我决定将构造函数也设为private或protected。这又回到了上面曾试图避免的问题,即不用new,那么该用什么方式来生成一个对象了?我们可以用间接的办法完成,即让这个类提供一个static成员函数专门用于产生该类型的堆对象。(设计模式中的singleton模式就可以用这种方式实现。)让我们来看看:
class NoStackObject
{
protected:
NoStackObject() { }
~NoStackObject() { }
public:
static NoStackObject* creatInstance()
{
return new NoStackObject() ;//调用保护的构造函数
}
void destroy()
{
delete this ;//调用保护的析构函数
}
};
现在可以这样使用NoStackObject类了:
NoStackObject* hash_ptr = NoStackObject::creatInstance() ;
... ... //对hash_ptr指向的对象进行操作
hash_ptr->destroy() ;
hash_ptr = NULL ; //防止使用悬挂指针
现在感觉是不是好多了,生成对象和释放对象的操作一致了。
2,设计只能在栈上分配的类
方法:重载new和delete为private成员
- using namespace std;
- class OnlyStack
- {
- public:
- OnlyStack()
- {
- cout<<"构造"<<endl;
- }
- ~OnlyStack()
- {
- cout<<"析构"<<endl;
- }
- private:
- void* operator new (size_t t);
- void operator delete(void *ptr);
- };
- int main()
- {
- //OnlyStack * a = new OnlyStack; //会报错
- OnlyStack a;
- return 0;
- }
- 设计只能在堆或者栈上创建的类
- 设计只能在堆或者栈上创建的类
- 设计只能在堆或者栈上创建的类
- 只能在栈上或者堆上创建对象
- 只能在栈上或者堆上创建对象
- 只能在栈上或者堆上创建对象
- 设计一个类只能在堆(栈)上创建
- 如何定一个只能在堆上或者只能在栈上定义的类
- 只能在堆(栈)上创建的类
- 设计一个类不能被继承;只能在堆上创建对象;只能在栈上创建对象
- 设计类不能被继承 、只能在堆上创建对象、只能在栈上创建对象。
- 怎么限制一个类的对象实例,只能在"堆"上分配,或者只能在"栈"上分配
- 根据类(不能被继承、只能在栈上/堆上创建对象)的特点设计一个类
- 类--设计一个类不能被继承&&设计一个类只能在堆上创建对象&&设计一个类只能在栈上创建对象。
- -设计一个类不能被继承 2.设计一个类只能在堆上创建对象。 3.设计一个类只能在栈上创建对象。
- 1.设计一个类不能被继承 2.设计一个类只能在堆上创建对象。 3.设计一个类只能在栈上创建对象
- 设计一个类不能被继承 2.设计一个类只能在堆上创建对象。 3.设计一个类只能在栈上创建对象
- C++:1.设计一个类不能被继承 2.设计一个类只能在堆上创建对象。 3.设计一个类只能在栈上创建对象。
- android:id="@+id/android:empty属性的用法举例
- ASIHTTPRequest 详解
- sql access excel 数据互导
- OD中条件断点的设置SHIFT+F4
- 什么是Java高手
- 设计只能在堆或者栈上创建的类
- alter語句刪除表中一個字段
- Linux Shell编程入门
- ios5 中文键盘高度变高覆盖现有ui问题的解决方案(获取键盘高度的方法)
- CAsyncSocket
- 用Jquery UI Sortable与数据库实现div拖动(类似iGoogle)
- 五个免费得开源数据挖掘软件
- 使用matchcode object + 搜索帮助 实现F4
- Random Number Generation