保护类不在main()之前实例化 我想确保我的C++类在输入主()之前从未被实例化。有没有办法做到这一点

保护类不在main()之前实例化 我想确保我的C++类在输入主()之前从未被实例化。有没有办法做到这一点,c++,singleton,C++,Singleton,-- 一些澄清: 我正在编写一个嵌入式应用程序。我的类必须是静态的(驻留在BSS中),但在实例化时,它需要一些在main()的开头初始化某些内容之前不可用的资源。所以我想让它成为梅耶斯的单身汉。理想情况下,我希望做出某种断言,以确保MyClass::instance()永远不会在main()之前被调用。在调用某个方法之前限制类的构造将是一场失败的战斗。特别是如果该方法是main()。我能问一下你为什么有这个要求吗?也许有另一种方法可以解决您试图解决的实际问题 编辑:感谢CTQ,从中判断,您的最佳

--

一些澄清:


我正在编写一个嵌入式应用程序。我的类必须是静态的(驻留在BSS中),但在实例化时,它需要一些在main()的开头初始化某些内容之前不可用的资源。所以我想让它成为梅耶斯的单身汉。理想情况下,我希望做出某种断言,以确保MyClass::instance()永远不会在main()之前被调用。

在调用某个方法之前限制类的构造将是一场失败的战斗。特别是如果该方法是
main()
。我能问一下你为什么有这个要求吗?也许有另一种方法可以解决您试图解决的实际问题

编辑:感谢CTQ,从中判断,您的最佳选择可能是最简单的解决方案,即静态布尔值。因为它是嵌入式的,所以我假设你几乎可以控制整个环境。您可能只需要在
::instance()
中基于静态bool的简单断言


进一步,听起来你需要依赖注入或其他方式确保资源以正确的顺序初始化,我敢说,这不是我在C++中解决的问题(更不用说在嵌入式系统上)。对于这种情况最有效的方法,我不能给出任何额外的见解,并建议你考虑一下这个问题的其他答案之一。也许你可以做一些粗俗的事情来达到这个目的,但是你不应该这样做


描述更全面的需求,我确信可以找到更好的解决方案。

给你的类一个在第一次实例化时设置的静态bool,并在main()开头检查它


使用工厂或将构造函数设置为私有不会阻止它在main()之前实例化的类的构造函数中实例化。

一种可能的方法是在main()内实例化该类。i、 e

MyClass * g_thing = 0;
int main()
{
    g_thing = new MyClass();
}

除此之外,这是一个棘手的、特定于编译器的混乱局面。您想要实现什么?

如果您可以控制main()启动时执行的代码,那么您可以拥有如下函数:

bool wasMain (bool inMain = false) {
  static bool passedMain = false;
  return passedMain |= inMain;
}
然后,main use中的第一行是main(true),从那以后它将返回true,而在那一点之前它将返回false

编辑:我只是喜欢较短的代码,上面的实现可以简化为:

bool wasMain (bool inMain = false) {
  static bool passedMain = false;
  if (inMain)
    passedMain = true;
  return passedMain;
}

您可以做的一件事是使用一个静态方法,如
MyClass::enableConstruction()
,它打开类中的静态标志。如果在该标志为false时调用了c'tor,那么它将抛出一个异常。这样,您将有一些运行时迹象表明有人违反了规则


请注意,在初始化该静态标志时应小心。为了避免任何构造顺序问题,最好将其设置为第一次访问时初始化的单例。

这实际上与所问的问题无关。这是一种解决问题的替代方法(同时添加其他限制;但没有什么是完美的)。我本应该更好地解释我自己,但我不认为这与问题无关。由于添加了澄清,我的问题已脱离主题。嗯,我正在编写一个嵌入式应用程序。我的类必须是静态的(驻留在BSS中),但在实例化时,它需要一些在main()的开头初始化某些内容之前不可用的资源。所以我想让它成为梅耶斯的单身汉。理想情况下,我希望做出某种断言,以确保MyClass::instance()永远不会在main()之前调用。类(非全局)是否可以在main()之前实例化??。。我以前知道控件从主函数开始。。静态存储区域可以使用static关键字分配给类。是的,它可以间接地从另一个全局类分配。例如,
Bar::Bar(){static Foo notGlobal;}
-如果有一个类型为Bar的全局对象,那么Foo对象将被构造为该全局条的一部分。哦,修复方法可能是不是从main()初始化“那些东西”,而是在它们自己的Meyers单例中初始化。当然,除非它们依赖于argv[]。@MSalters。。如果我把这当作一个问题问的话。。你应该得到一些分数;-)@听起来很有趣。你知道我在哪里可以读到更多关于这种策略的信息吗?