是否可以防止对象的堆栈分配,而只允许使用" new"实例化它?
时间:2020-03-06 14:38:14 来源:igfitidea点击:
是否可以防止对象的堆栈分配,而只允许在堆上使用" new"来初始化它?
解决方案
我们可以将构造函数设为private,然后提供public静态工厂方法来创建对象。
一种执行此操作的方法是将构造函数设为私有,并且仅允许通过返回指针的静态方法进行构造。例如:
class Foo
{
public:
~Foo();
static Foo* createFoo()
{
return new Foo();
}
private:
Foo();
Foo(const Foo&);
Foo& operator=(const Foo&);
};
我们可以创建一个为对象提供抽象接口的头文件,以及返回指向在堆上创建的对象的指针的工厂函数。
// Header file
class IAbstract
{
virtual void AbstractMethod() = 0;
public:
virtual ~IAbstract();
};
IAbstract* CreateSubClassA();
IAbstract* CreateSubClassB();
// Source file
class SubClassA : public IAbstract
{
void AbstractMethod() {}
};
class SubClassB : public IAbstract
{
void AbstractMethod() {}
};
IAbstract* CreateSubClassA()
{
return new SubClassA;
}
IAbstract* CreateSubClassB()
{
return new SubClassB;
}

