是否可以强制在堆上进行 C++ class 实例化?

Is it possible to force c++ class instantiation on the heap?

我需要在线程应用程序中使用这个 class 所以在堆栈上实例化它显然是一个问题,有没有办法在实例化 [= 时强制使用 new 39=]?

我已经制作了构造函数 privatenew 运算符 public,类似于

public:
    void *operator new(size_t);

private:
    SomeClass(void);
    SomeClass(SomeType value); 
               .
               .
               .

但正如我在使用时预期的那样

SomeClass *heapInstance = new SomeClass(value);

编译器告诉我构造函数是私有的。

问题:

注意:我到处都使用这个class,现在我需要修复我的代码,即我需要编译器来防止编译所以我不需要手动搜索每次出现,我不是很擅长 c++ 我只是不得不使用它,因为我需要做一个 GUI 跨平台应用程序并选择 Qt 出于几个与这里无关的原因。

只需创建 ctor private/protected 并提供静态方法来创建实例:

class HeapOnly {
     HeapOnly();
     HeapOnly( int i );
public:
     static HeapOnly *create() { return new HeapOnly; }
     static HeapOnly *create( int i ) { return new HeapOnly( i ); }
};

在一般情况下,您可以考虑 return 一个 std::unique_ptr,但对于 Qt 来说,这可能是不必要的。

这不会立即解决您的问题,但您会在创建实例的任何地方遇到编译错误,您可以通过创建函数调用捕获在堆栈上创建 class 实例的地方来替换它们。