我有自主的过程监控一个辅助类,并且因为它是一个有点“射后不理”机制,一大缺陷是,你可以使用它像这样:你可以禁止本地实例化一个类吗?
MyClass的C(过程);
但是,当c超出范围,线程内停止,并没有通知,显然,从它出来。
你应该如何做到这一点是这样的:
MyClass的* C =新MyClass的(过程);
并自己处理一生。
有没有一种简单的,很好的方式来禁止本地实例化,只允许C++中的“新”?
干杯!
Valmond
我有自主的过程监控一个辅助类,并且因为它是一个有点“射后不理”机制,一大缺陷是,你可以使用它像这样:你可以禁止本地实例化一个类吗?
MyClass的C(过程);
但是,当c超出范围,线程内停止,并没有通知,显然,从它出来。
你应该如何做到这一点是这样的:
MyClass的* C =新MyClass的(过程);
并自己处理一生。
有没有一种简单的,很好的方式来禁止本地实例化,只允许C++中的“新”?
干杯!
Valmond
可以使类私有的析构函数实例化(并定义替代成员函数用于释放)。这禁止该类的任何直接堆栈实例化,只允许堆(new
)实例化。
注意:这比使私有构造函数更好,因为对象仍然可以直接创建而不是通过函数创建。另外,只有一个需要私有化的析构函数,但可能有很多构造函数。
做删除,可以实现类似:
struct MyStruct
{
void free()
{
delete this;
}
private:
~MyStruct() {};
};
int main()
{
MyStruct* s = new MyStruct;
s->free();
}
你可以使构造私有,然后允许通过一个朋友的功能,它总是做它通过新的
“你应该怎么做... 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>
中会导致与原来相同的确切问题。
另一种可能的解决方案(除了声明私有构造或析方法)是智能指针的使用通过声明自己的类型是这样的: 的typedef的std ::的unique_ptr PtrMyClass; 但它不是优雅的方式。 –
LmTinyToon
好吧,我通过公共成员函数调用析构函数,但是如何删除? – Valmond
对不起,我是个白痴,我只是在公共成员函数中做一个删除(这个),欢呼声和谢谢! – Valmond