是否可以在堆上强制执行c ++类实例化?

时间:2015-01-14 14:51:51

标签: c++ class heap instantiation

我需要在线程应用程序中使用此class,因此在堆栈上实例化它显然是一个问题,有没有办法强制new在实例化类时使用?

我已将构造函数privatenew运算符设为public,类似于

public:
    void *operator new(size_t);

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

但正如我预期的那样使用

SomeClass *heapInstance = new SomeClass(value);

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

问题

  • 有解决方法吗?

注意:我已经在所有地方使用了这个class,现在我需要修复我的代码,即我需要编译器来阻止编译所以我不要这样做需要手动搜索每一个事件,我不是很擅长c ++我只是不得不使用它因为我需要做一个GUI跨平台应用程序并选择Qt有几个原因在这里无关紧要。

1 个答案:

答案 0 :(得分:8)

只需将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 ); }
};

您可以考虑在一般情况下返回std::unique_ptr,但对于Qt则可能没有必要。

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