我们可以防止创建具有静态生存期的对象,而同时允许创建具有自动生存期的对象吗?
如果要阻止用户创建具有自动持续时间的类的实例,则可以将析构函数设为私有(private)。并且如果要阻止用户创建具有动态分配的实例,则可以将operator new
设为私有(private)。
我认为不可能阻止用户创建具有静态存储持续时间的对象,因为唯一的区别是生存期。但也许这里的一些专家可以设计出一种方法。
最佳答案
没有,没有语言设施可以在编译时提供帮助。但是在运行时,您可以使用以下技术来限制的。假设您不希望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和指针)。