码迷,mamicode.com
首页 > 其他好文 > 详细

只允许对象生成于堆内

时间:2015-05-11 19:31:26      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:

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

假如,手头上有一个类Person,当你在程序中写下Person rn时,

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

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

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

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


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

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

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

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

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

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

本例完整的代码如下所示。
#include<iostream>
using  namespace std;

class Person
{
public:
    Person()
    {
        cout<<"Con()"<<endl;
    }
    Person(int x)
    {
        a = x;
        cout<<"Con(x)"<<endl;
    }
    void  Destroy()
    {
        delete this;
    }

protected:
    ~Person()
    {
        cout<<"Des"<<endl;
    }
private:
    int a;
};

class  Student:public Person
{

};

class Test
{
public:
    Test()
    {
        ps = new  Person();    //堆上对象
    }
    ~Test()
    {
        ps->Destroy();
    }
private:
    Person *ps;
};

void main()
{
    Test t1;
}
转载自:http://www.cnblogs.com/Braveliu/archive/2013/01/06/2847475.html

 

只允许对象生成于堆内

标签:

原文地址:http://www.cnblogs.com/leijiangtao/p/4495185.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!