其他分享
首页 > 其他分享> > C,防止在堆栈上创建类实例(在编译期间)

C,防止在堆栈上创建类实例(在编译期间)

作者:互联网

我知道有一些方法可以阻止用户使用new和delete操作符来阻止在堆上创建类.我正试图做相反的事情.我有一个类,我想阻止用户在堆栈上创建它的实例,并且只有使用new运算符发起的实例才会编译.更具体地说,我希望以下代码在编译期间收到错误:

MyClass c1; //compilation error

MyClass* c1 = new MyClass(); //compiles okay

通过搜索网络,我发现了如何做到这一点的建议:

class MyClass {
public:
    MyClass();
private:
    void destroy() const { delete this; }

...

private:
    ~MyClass();
};

int main(int argc,char** argv)
{
    MyClass myclass; // <--- error, private destructor called here !!!

    MyClass* myclass_ptr = new MyClass;
    myclass_ptr->destroy();
}

我不明白为什么这应该工作.为什么在创建MyClass实例时会调用析构函数?

解决方法:

当myclass到达其作用域的末尾(下一个})时,编译器会调用析构函数将其从堆栈中释放出来.但是,如果析构函数是私有的,则无法访问析构函数,因此无法将类放在堆栈上.

我不喜欢删除它的外观.总的来说,我认为对象不应该破坏自己.也许更好的方法是为您的类创建一个私有构造函数,然后使用静态函数来创建实例.

// In class declaration...
static MyClass* Create()
{
    return new MyClass(); // can access private constructor
}

// ...

MyClass myclass; // illegal, cannot access private constructor

MyClass* pMyClass = MyClass::Create();
delete pMyClass; // after usage

标签:c,class-design
来源: https://codeday.me/bug/20191004/1852354.html