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