文逸首页 小文论坛 文逸博客 精华文章
 首页 | 新闻 | 论坛 | 博客 | 专题 | FTP | 金融 | 微博 | 图库 | MyHome | 搜索 | 登陆 | 注册 | 帮助 | 设为首页  ·在线人数: 454
 §您的位置:文逸首页 > chinesedragon 's home > 【理论研究】专栏 > 只能用new生.
chinesedragon 的主页网址:http://wonyen.net/home.aspx?id=chinesedragon 给我留言

 § chinesedragon  的【理论研究】专栏

  作者:chinesedragon  发表时间: 2005/12/3 13:40:12    查看: 5616     评论: 6
标题: 只能用new生成的对象

只能用new生成的对象 
 

用new生成的对象,在面向对象中是很有用的.它保存在堆上,可以自由控制生命周期。

但如何保证一个对象只能在堆上生成呢?

答案其实也很简单,只需把析构函数定义为私有成员。例如OnlyCanBeNew类定义。

   1|     class OnlyCanBeNew

   2|     {

   3|         ~OnlyCanBeNew(){}

   4|     public:

   5|         OnlyCanBeNew(){}

   6|     };

原因呢,C++是一个静态绑定的语言。在编译过程中,所有的非虚函数调用都必须分析完成。即使是虚函数,也需检查可访问性。因些,当在栈上生成对象时,对象会自动析构,也就说析构函数必须可以访问。而堆上生成对象,由于析构时机由程序员控制,所以不一定需要析构函数。

保证了不能在栈上生成对象后,需要证明能在堆上生成它。这里OnlyCanNew与一般对象唯一的区别在于它的析构函数为私有。delete操作会调用析构函数。所以不能编译。那么如何释放它呢?

答案也很简单,提供一个成员函数,完成delete操作。在成员函数中,析构函数是可以访问的。当然detele操作也是可以编译通过。

   7|         void OnlyCanBeNew::Destroy()

   8|         {   

   9|             delete this;

10|         }

回到起点,如果需要再在栈上使用这个对象,怎么办呢。那就要用到包装了。类似Wrap类这样的类,如果它与OnlyCanBeNew接口的一样。那么在栈上使用它,就与使用OnlyCanBeNew一样了。

11|     #include <stdio.h>

12|      

13|     class Wrap;

14|     class OnlyCanBeNew

15|     {

16|         friend class Wrap;

17|         ~OnlyCanBeNew(){}

18|     public:

19|         OnlyCanBeNew(){}

20|         void Destroy()

21|         {   

22|             delete this;

23|         }

24|     };

25|      

26|     class Wrap

27|     {

28|         OnlyCanBeNew *p;

29|     public:

30|         Wrap(): p(new OnlyCanBeNew)

31|         {

32|         }

33|      

34|         ~Wrap()

35|         {

36|             p->Destroy();

37|         }

38|      

39|     };

测试代码如下:

40|     int main(int argc, char *argv[])

41|     {

42|         OnlyCanBeNew one; //编译错误

43|      

44|         Wrap some; //OK

45|         OnlyCanBeNew * p = new OnlyCanBeNew; //OK

46|      

47|         p->Destroy(); //释放

48|         printf("Hello, world\n");

49|         

50|         return 0;

51|     }
 

分享到:


 §评论: 只能用new生成的对象

  回复者:icando    回复时间:2005/12/4 18:56:50    [第1评]
呵呵 wrap 是在栈上使用那个对象吗?


  回复者:腾讯    回复时间:2011/11/20 18:18:02    [第2评]
QQ抽奖

QQ抽奖活动

腾讯周年挖宝行动是真的吗

腾讯公司有抽奖活动吗

QQ中奖是真的吗

腾讯中奖是真的吗


  回复者:王博    回复时间:2012/7/24 22:16:51    [第3评]
要求大家点击一下查看这些不法分子!
星光大道抽奖活动
星光大道官方网站
星光大道中奖查询网
星光光大道中奖是真的吗
QQ信封


3 条评论;  每页显示 15 条评论;   1 / 1               ↑到页首




您未登陆,发表评论时请填写:用户名 密码 注册新用户  
 评论: 只能用new生成的对象
内容 (8000字以内)
 (CTRL+ENTER提交) 
  关闭窗口  
用户登陆
我要发表文章
搜 索
§chinesedragon 的网志导航
感想随笔(4)
生活休闲(0)
饮食健康(0)
自然妙趣(1)
潮流时尚(0)
游览见闻(0)
情感绿洲(6)
娱乐搞笑(4)
读图时代(3)
影音视听(4)
商业新知(0)
理论研究(6)
时事纵横(13)
社会文化(15)
文学欣赏(3)
教育学习(15)
§chinesedragon 的友情链接
关于文逸 | 小文论坛 | 文逸博客 | 文逸金融 | 精华文章网站地图 | 联系我们 | 隐私保护
 Copyright© WWW.WONYEN.NET 2003 - 2021  闽ICP备09016518号-16   本站最高 10508 人同时在线,发生时间 2005-5-17 5:09:15 
 文逸科技 制作维护