只允许对象生成于堆内

只允许对象生成于堆内?怎么理解?肿么办?

我们已经知道,假如手头上有一个类Person,当你在程序中写下Person objTemp;时,

编译器悄悄地做了两件事:调用constructor构造对象objTemp,而在弹栈时,调用析构函数destructor析构掉对象objTemp。

对象rn的构造和析构全部由编译器负责,这是栈的特性!

诸所周知,对象rn生成于栈内。

而我们现在的要求是什么?“只允许对象生成于堆内。”rn明显违背了我们的要求,也就意味着它应该被禁止。


那这种 “坑爹型”的事情肿么办呢?有人想说,只要让Person的构造函数或者析构函数成为private就OK了。

也许许多人真会有这样的第一想法,假使那样,咱再往下进一步思考。

如果那样的话,这个类可以实现继承吗?No,即就是禁止继承。

另外,这个类允许其他类拥有它的对象吗?No,即就是禁止包含。

那怎么办呢? 解决的方法也很简单,解除继承的副作用只需让Person的析构函数成为protected就可以了;

解决内含的副作用只需让Test中的成员变量ps成为Person*类型并在Test的构造/析构函数中对成员变量做初始化和释放操作就可以了。

本例完整的代码如下所示。

 1 #include<iostream>
 2 using  namespace std;
 3 
 4 class Person
 5 {
 6 public:
 7     Person()
 8     {
 9         cout<<"Con()"<<endl;
10     }
11     Person(int x)
12     {
13         a = x;
14         cout<<"Con(x)"<<endl;
15     }
16     void  Destroy()
17     {
18         delete this;
19     }
20 
21 protected:
22     ~Person()
23     {
24         cout<<"Des"<<endl;
25     }
26 private:
27     int a;
28 };
29 
30 class  Student:public Person
31 {
32 
33 };
34 
35 class Test
36 {
37 public:
38     Test()
39     {
40         ps = new  Person();    //堆上对象
41     }
42     ~Test()
43     {
44         ps->Destroy();
45     }
46 private:
47     Person *ps;
48 };
49 
50 void main()
51 {
52     Test t1;
53 }

Good Good Study, Day Day Up.

顺序  选择  循环  坚持

posted @ 2013-01-06 12:16  kaizenly  阅读(377)  评论(0编辑  收藏  举报
打赏