你能禁止 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> 中会导致与您最初遇到的问题完全相同的问题。