c++ - 如果构造函数抛出异常,那么拥有该类的全局对象是否有意义?

标签 c++ exception global-variables coding-style

我问这个问题是为了获得一般的编码指南:

class A {
  A() { ... throw 0; }
};
A obj;  // <---global

int main()
{
}

如果 obj 在上面的代码中抛出异常,它最终会在调用 main() 之前终止代码。所以我的问题是,对于这种情况我应该采取什么指导方针?是否可以为此类类声明全局对象?我应该始终克制自己不这样做,还是从一开始就发现错误是一种很好的趋势?

最佳答案

如果您需要一个其构造函数可以抛出的对象的全局实例,您可以将变量设为静态,而不是:

A * f(){

   try {

      //lock(mutex);   -> as Praetorian points out
      static A a;
      //unlock(mutex);

      return &a;
   }
   catch (...){

      return NULL;
   }
}

int main() {

   A * a = f(); //f() can be called whenever you need to access the global

}

这将缓解由过早异常引起的问题。

编辑:当然,在这种情况下,解决方案是成为单例的 90%。为什么不通过将 f() 移动到 A 来将它完全变成一个?

关于c++ - 如果构造函数抛出异常,那么拥有该类的全局对象是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6984156/

相关文章:

c++ - 由于我无法返回局部变量,从 C 或 C++ 函数返回字符串的最佳方法是什么?

asp.net - 在ASP.NET中如何识别/处理404异常?

C# 如何在 Assert.AreEqual 中期待异常?

Python函数全局变量?

c - 节点的全局变量

c++ - 我怎样才能在Qt中绘制一条由画笔填充的开放曲线?

C++11 lambda : member variable capture gotcha

c++ - 了解 POSIX select() 和读写 fd_set

python - 在 python 中处理断言

PHP session 扩展不考虑全局变量