你能禁止 class 的本地实例化吗?
Can you forbid local instantiation of a class?
我有一个用于自主进程监控的助手class,因为它有点"fire and forget"机制,一个很大的陷阱是你可以这样使用它:
MyClass c(process);
但是当 c 超出范围时,里面的线程停止并且没有通知,显然,它发出。
你应该怎么做:
MyClass *c=new MyClass(process);
并自己处理生命周期。
有没有一种简单、好的方法来禁止本地实例化,只允许在 c++ 中使用 "new"?
干杯!
瓦尔蒙德
您可以将构造函数设为私有,然后允许通过友元函数进行实例化,该函数始终通过 new
您可以将 class 的析构函数设为私有(并定义一个替代成员函数用于释放)。这禁止 class 的任何直接堆栈实例化,只允许堆 (new
) 实例化。
注意:这比将构造函数设为私有要好,因为仍然可以直接创建对象而不是通过函数。而且只有一个析构函数需要私有化,但是可以有很多构造函数。
要执行删除操作,您可以执行如下操作:
struct MyStruct
{
void free()
{
delete this;
}
private:
~MyStruct() {};
};
int main()
{
MyStruct* s = new MyStruct;
s->free();
}
"How you should do it ... 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>
中会导致与您最初遇到的问题完全相同的问题。
我有一个用于自主进程监控的助手class,因为它有点"fire and forget"机制,一个很大的陷阱是你可以这样使用它:
MyClass c(process);
但是当 c 超出范围时,里面的线程停止并且没有通知,显然,它发出。
你应该怎么做:
MyClass *c=new MyClass(process);
并自己处理生命周期。
有没有一种简单、好的方法来禁止本地实例化,只允许在 c++ 中使用 "new"?
干杯!
瓦尔蒙德
您可以将构造函数设为私有,然后允许通过友元函数进行实例化,该函数始终通过 new
您可以将 class 的析构函数设为私有(并定义一个替代成员函数用于释放)。这禁止 class 的任何直接堆栈实例化,只允许堆 (new
) 实例化。
注意:这比将构造函数设为私有要好,因为仍然可以直接创建对象而不是通过函数。而且只有一个析构函数需要私有化,但是可以有很多构造函数。
要执行删除操作,您可以执行如下操作:
struct MyStruct
{
void free()
{
delete this;
}
private:
~MyStruct() {};
};
int main()
{
MyStruct* s = new MyStruct;
s->free();
}
"How you should do it ... 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>
中会导致与您最初遇到的问题完全相同的问题。