我们可以阻止创建具有静态生命周期的对象,同时允许使用自动生命周期创建对象吗?
如果我们想阻止用户创建具有自动持续时间的类的实例,我们可以将析构函数设为私有。如果我们想阻止用户使用动态分配创建实例,我们可以将operator new
设为私有。
我认为不可能阻止用户创建具有静态存储持续时间的对象,因为唯一的区别是生命周期。但也许这里的一些专家可以设计一种方式。
答案 0 :(得分:3)
没有语言工具有助于编译时。但在运行时,您可以使用以下技术限制。假设您不希望在MyObject
存储区域static
,请在析构函数中添加代码:
bool ALLOW_OBJECTS = false; // global variable
struct MyObject // class body
{
~MyObject ()
{
if(ALLOW_OBJECTS == false)
<print error message>
// ...
}
};
现在,在main()
方法中,您可以ALLOW_OBJECTS
为
int main ()
{
ALLOW_OBJECTS = true; // objects can be created now
// ... other code
ALLOW_OBJECTS = false; // reset to 'false' before main() ends
}
现在,在static
存储中声明的变量在main()
完成后消失了它们的生命周期(调用析构函数)。因此,如果在static
存储上声明了变量,则其析构函数将打印错误消息(在文件或标准输出中)。
通过此检查,您的1次执行测试运行可能会失败,但您可以在找到错误消息数后手动更正代码。因此,在您的生产代码中,您可以删除所有这些调试语句,并且您的代码没有任何 static
存储对象! (不适用于POD和指针)。
答案 1 :(得分:0)
Requiring or Prohibiting Heap-based Objects维基书上有一张收据。
关键是要保护类析构函数,以便使用静态创建的对象将生成编译时错误。缺点是您必须为类实现并调用单独的 delete 方法。
class HeapOnly {
public:
HeapOnly() {}
void destroy() const { delete this; }
protected:
~HeapOnly() {}
};
HeapOnly h1; // Destructor is protected so h1 can't be created globally
HeapOnly func() // Compiler error because destructor of temporary is protected
{
HeapOnly *hoptr = new HeapOnly; // This is ok. No destructor is invoked automatically for heap-based objects
return *hoptr;
}
int main(void) {
HeapOnly h2; // Destructor is protected so h2 can't be created on stack
}