【问题标题】:Delay initializing a reference - what to initialize with?延迟初始化引用 - 用什么初始化?
【发布时间】:2014-08-23 05:13:14
【问题描述】:

我有一个类,我希望在稍后的程序初始化时实例化它。在此之前,我绝对不想要该类的任何实例。我希望这个实例在全局范围内可用。

最简单的方法是拥有一个全局变量,它是对该类的引用,这很简单 - 只需在类实例化后立即分配引用。除了在那之前我需要用 something 填充该引用,否则我将 声明为引用但未初始化,我宁愿不创建所述的虚拟实例类。

什么是让它工作的正确方法?

    configClass&  global_config;   // = ?


    init()
    {
       //... other prerequisites for loading the config
       static configClass _cfg(CONFIG_FILE,other_params);
       global_config = _cfg;
       //more code, using global_config
    }

【问题讨论】:

  • 您不能使引用指向与创建它的对象不同的对象。你需要一种不同的方法。也许是一个指针?或具有静态成员的函数。
  • I want this instance to be available in global scope 为什么?
  • @LightnessRacesinOrbit:因为它在所有代码的成千上万个地方都使用过,并且将其隐藏在任何命名空间或类似的东西后面会极大地适得其反吗?但为了您的安心,这一切都在一个命名空间内。
  • @SF。您在“成千上万的地方”使用全局变量?神圣的汉娜,我很遗憾听到这个消息;(
  • 全局变量的存在始于动态分配成本太高而无法使用的时候。今天没有理由使用用户模式进程全局变量。

标签: c++ reference


【解决方案1】:

这就是指针的用途。
将一个设置为nullptr,直到它指向存在的东西。

或者,或者,调查boost::optional

更好的是,完全取消这个全局。
您可以已经看到它在您的代码中造成的问题/混乱!

【讨论】:

  • 只是出于好奇——在这种情况下 (global_config) 你有什么建议?与将 this 作为参数传递给需要访问这些设置的每个函数相比,有时全局变量是非常简单的解决方案。
  • @AdrianLis:在不了解您的架构的情况下,我不可能说出来。但这听起来像一个懒惰的黑客,稍后会给你带来问题。课程怎么了?
  • @SF。如果您将其称为“一千次”,那么某些事情已经非常错误,应该在您做任何其他事情之前解决。
  • @SF.:你们为什么有“几百个班”?参考我之前的评论。你试图通过调用一个糟糕的设计来为一个糟糕的决定辩护。
  • @SF。这样做很困难的事实证明您的设计已被破坏。根据配置,您不应该有数百个类。这使它成为上帝的对象。
【解决方案2】:

根据您的配置类的需要,一种选择可能是让configClass 包含它自己的init() 方法。然后您可以立即初始化引用(根据语言的要求),并从您的问题中的init() 方法调用global_config.init();

【讨论】:

    猜你喜欢
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2017-11-11
    • 1970-01-01
    相关资源
    最近更新 更多