C++栈对象产生禁用方式

开发 后端
C++栈对象的创建过程中,会移动栈顶指针以腾出一个适当大小的控件方便我们直接调用对应的构造函数来完成栈对象的创造。那么我们要想限制C++栈对象的产生又该如何操作呢?

我们在上一篇文章中为大家介绍了产生C++堆对象禁用的具体实现方式,相信大家应该有所掌握。今天我们将会为大家介绍同属于内存逻辑区域的C++栈对象的禁用方式。希望能让大家进一步对这方面的应用技巧有一个深刻的认识。#t#

创建C++栈对象时会移动栈顶指针以“挪出”适当大小的空间,然后在这个空间上直接调用对应的构造函数以形成一个栈对象,而当函数返回时,会调用其析构函数释放这个对象,然后再调整栈顶指针收回那块栈内存。在这个过程中是不需要operat or newdelete操作的,所以将operator newdelete设置为private不能达到目的。当然从上面的叙述中,你也许已经想到了:将构造函数或析构函数设为私有的,这样系统就不能调用构造析构函数了,当然就不能在栈中生成对象了。

这样的确可以,而且我也打算采用这种方案。但是在此之前,有一点需要考虑清楚,那就是,如果我们将构造函数设置为私有,那么我们也就不能用new来直接产生堆对象了,因为new在为对象分配空间后也会调用它的构造函数啊。所以,我打算只将析构函数设置为private。再进一步,将析构函数设为private除了会限制栈对象生成外,还有其它影响吗?是的,这还会限制继承。

如果一个类不打算作为基类,通常采用的方案就是将其析构函数声明为private。

为了限制C++栈对象,却不限制继承,我们可以将析构函数声明为protected,这样就两全其美了。如下代码所示:

  1. class NoStackObject   
  2. {   
  3. protected   
  4. ~NoStackObject() { }   
  5. public   
  6. void destroy()   
  7. {   
  8. delete this ;调用保护析构函数   
  9. }   
  10. };  

 

接着,可以像这样使用NoStackObject类:

  1. NoStackObject hash_ptr = new NoStackObject() ;   
  2. ... ... 对hash_ptr指向的对象进行操作   
  3. hash_ptr-destroy() ;  

是不是觉得有点怪怪的,我们用new创建一个对象,却不是用delete去删除它,而是要用destroy方法。很显然,用户是不习惯这种怪异的使用方式的。所以,我决定将构造函数也设为private或protected。这又回到了上面曾试图避免的问题,即不用new,那么该用什么方式来生成一个对象了?我们可以用间接的办法完成,即让这个类提供一个static成员函数专门用于产生该类型的堆对象。(设计模式中的singleton模式就可以用这种方式实现。)让我们来看看:

  1. class NoStackObject   
  2. {   
  3. protected   
  4. NoStackObject() { }   
  5. ~NoStackObject() { }   
  6. public   
  7. static NoStackObject creatInstance()   
  8. {   
  9. return new NoStackObject() ;调用保护的构造函数   
  10. }   
  11. void destroy()   
  12. {   
  13. delete this ;调用保护的析构函数   
  14. }   
  15. }; 

 

现在可以这样使用NoStackObject类了:
 

  1. NoStackObject hash_ptr = NoStackObjectcreatInstance() ;   
  2. ... ... 对hash_ptr指向的对象进行操作   
  3. hash_ptr-destroy() ;   
  4. hash_ptr = NULL ; 防止使用悬挂指针 

以上就是对C++栈对象进行限制的相关操作方法。

责任编辑:曹凯 来源: 博客园
相关推荐

2010-02-03 14:18:44

2010-01-25 11:13:18

C++栈对象

2010-01-20 18:24:51

C++CLI

2010-02-03 17:06:36

C++对象复制

2010-01-26 17:35:09

C++栈

2010-01-21 11:23:58

C++函数调用

2010-02-05 17:58:32

C++链栈模板

2010-01-18 13:42:51

C++代码

2010-02-05 16:46:58

C++ TinyXml

2010-02-06 17:39:52

C++ strtok

2010-01-25 14:18:46

C++对象模型

2010-01-25 09:50:58

C++函数对象

2010-02-01 17:02:53

C++产生随机数

2024-01-19 21:55:57

C++编程代码

2010-02-05 15:04:41

C++定义变量

2010-02-06 16:39:45

C++ assert(

2010-02-04 13:39:44

C++数组参数

2010-02-06 16:21:35

C++常规DLL

2010-02-03 15:27:26

C++ static

2010-02-04 14:29:45

C++ typenam
点赞
收藏

51CTO技术栈公众号