如何定义一个只能在堆上生成对象的类?

如何定义一个只能在堆上生成对象的类?

首先我们想一下,一个对象它既可以在栈上生成也可以由我们在堆上new生成。现在我们如果只想在堆上生成对象而不能在栈上生成对象,在类外我们是无法完成的,所以我们必须从类的内部来入手。



那么我们开始操作:


我们知道类对象的初始化是由类的构造函数完成的,如果我们把类的构造函数访问权限声明为protected,让构造函数不能在类外调用,这样做就保证了在类外不能在栈上生成对象了,但同时,我们也不能在类外new出对象了。



怎么办?我们可以在类内new一个对象并且提供一个公有的接口来返回这个对象。接下来如果在类外定义类对象的话,只需要定义这个函数即可。这样做真的可以吗?你怎么调用这个接口?你不能调用构造?怎么用类对象调用这个接口?



所以我们需要把这个接口声明为静态成员函数,就解决啦!
我们来看一个例子:

template<class T>
class Heap_Only
{
public:
    static Heap_Only* Get_Memory(T a)
    {
        return new Heap_Only(a);
    }
    ~Heap_Only()
    {
        delete this;
    }
protected:
    Heap_Only(T a)
        :_a(a)
        {}
private:
    T _a;
};
int main()
{
    Heap_Only<int>* hp ;
    hp->Get_Memory(10);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值