我们可以防止创建具有静态生存期的对象,而同时允许创建具有自动生存期的对象吗?

如果要阻止用户创建具有自动持续时间的类的实例,则可以将析构函数设为私有(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和指针)。

07-24 14:07