2016-05-25 15 views
3

我有自主的过程监控一个辅助类,并且因为它是一个有点“射后不理”机制,一大缺陷是,你可以使用它像这样:你可以禁止本地实例化一个类吗?

MyClass的C(过程);

但是,当c超出范围,线程内停止,并没有通知,显然,从它出来。

你应该如何做到这一点是这样的:

MyClass的* C =新MyClass的(过程);

并自己处理一生。

有没有一种简单的,很好的方式来禁止本地实例化,只允许C++中的“新”?

干杯!

Valmond

回答

6

可以使类私有的析构函数实例化(并定义替代成员函数用于释放)。这禁止该类的任何直接堆栈实例化,只允许堆(new)实例化。

注意:这比使私有构造函数更好,因为对象仍然可以直接创建而不是通过函数创建。另外,只有一个需要私有化的析构函数,但可能有很多构造函数。

做删除,可以实现类似:

struct MyStruct 
{ 
    void free() 
    { 
     delete this; 
    } 

private: 
    ~MyStruct() {}; 

}; 

int main() 
{ 
    MyStruct* s = new MyStruct; 
    s->free(); 
} 
+0

另一种可能的解决方案(除了声明私有构造或析方法)是智能指针的使用通过声明自己的类型是这样的: 的typedef的std ::的unique_ptr PtrMyClass; 但它不是优雅的方式。 – LmTinyToon

+0

好吧,我通过公共成员函数调用析构函数,但是如何删除? – Valmond

+0

对不起,我是个白痴,我只是在公共成员函数中做一个删除(这个),欢呼声和谢谢! – Valmond

4

你可以使构造私有,然后允许通过一个朋友的功能,它总是做它通过新的

3

“你应该怎么做... new MyClass”。不,那不是你应该怎么做的。这是要求内存泄漏。

更好的方法是让

class MyClass { 
    MyClass(Process const&); 
public: 
    static std::unique_ptr<MyClass> make(Process const&); 
} 

这确实防止主叫方书面MyClass c {process};

当然,您的想法new MyClass也不是这个想法是绝对的预防。这两个指针必须存储在某个地方。存储在函数本地std::unique_ptr<MyClass>中会导致与原来相同的确切问题。

+0

感谢您的答案,但您的实施限制了几个实例的使用,我是对吗? – Valmond

+0

@Valmond:不,一点都不?事实上,如果只有一个实例,那么我们不能返回'std :: unique_ptr '。因为如果我们调用MyClass :: make()两次,我们会得到两个'unique_ptr',如果它们指向一个实例化,那么它显然不是唯一的。 – MSalters

+0

@MrSalters好的,谢谢你澄清我的误解! – Valmond

相关问题