Edu*_*yan 9 c++ static word-wrap static-initialization static-order-fiasco
有一次,我在读一个真棒C++ FAQ(这是真的好!)并阅读主题如何防止静态初始化命令"惨败".因此作者建议将静态变量包装到函数中,从而通过维护变量的创建顺序来防止"惨败".但在我看来,这是一个粗鲁的解决方法.所以我的问题是,是否有任何现代的,更多的模式导向的方法来防止这种"惨败",但将"静态东西"包装成函数???
所以我的问题是,是否有任何现代的、更面向模式的方法来防止这种“惨败”,而是将“静态内容”包装到函数中???
在大多数情况下,您可以在主函数中声明“全局”数据,并在需要时使用依赖项注入来传递它。换句话说,根本没有静态。
在实践中,您可能会遇到需要静态数据的情况。如果不依赖于其他静态数据,则将数据设为静态数据const/constexpr。
// smart pointer that implements the "Foo" release policy
class FooPointer
{
static const FooPointer NullFoo; // does not depend on other static values
/* ... */
};
Run Code Online (Sandbox Code Playgroud)
如果静态变量确实相互依赖,只需将它们包装在静态函数中:
// smart pointer that implements the "Foo" release policy
class FooPointer
{
static const FooPointer& NullFoo(); // depends on other static values
/* ... */
};
Run Code Online (Sandbox Code Playgroud)
总结一下:
大多数(90%?99%?)静态/全局/共享数据应该依赖注入到使用它的地方,而不是创建为静态的。
在极少数情况下,当出于某种原因需要静态变量并且它们不依赖于其他静态变量时,请声明静态变量。
在极少数情况下,当静态需要静态并且它们相互依赖时,请在静态方法中对它们进行wap。
根据经验,如果你有很多第二种和第三种情况,那么你对第一种情况做得还不够。
| 归档时间: |
|
| 查看次数: |
3382 次 |
| 最近记录: |