如何定义一个只能在堆上生成对象的类?
首先我们想一下,一个对象它既可以在栈上生成也可以由我们在堆上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);
}