是否可以防止对象的堆栈分配,而只允许使用" 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; }