是否可以强制在堆上进行 C++ class 实例化?
Is it possible to force c++ class instantiation on the heap?
我需要在线程应用程序中使用这个 class
所以在堆栈上实例化它显然是一个问题,有没有办法在实例化 [= 时强制使用 new
39=]?
我已经制作了构造函数 private
和 new
运算符 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 实例的地方来替换它们。
我需要在线程应用程序中使用这个 class
所以在堆栈上实例化它显然是一个问题,有没有办法在实例化 [= 时强制使用 new
39=]?
我已经制作了构造函数 private
和 new
运算符 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 实例的地方来替换它们。