在main()之前保护类不被实例化

时间:2009-12-04 14:57:46

标签: c++ singleton

我想确保在输入main()之前从未实例化我的C ++类。有没有办法实现这个目标?

-

一些澄清:

我正在编写一个嵌入式应用程序。我的类必须是静态的(驻留在BSS中),但是在实例化时,它需要一些在main()开始时初始化某些东西之前不可用的资源。所以我想把它变成迈耶斯单身人士。理想情况下,我想做一些断言,确保在main()之前永远不会调用MyClass :: instance()。

6 个答案:

答案 0 :(得分:7)

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

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

更进一步,听起来你需要依赖注入或其他一些方法来确保你的资源以正确的顺序初始化,我会说实话,这不是我在C ++中解决的问题(更不用说在嵌入式系统上了)。我不能对这种情况最有效的方法给出任何额外的见解,并建议你考虑这个问题的其他答案之一。

答案 1 :(得分:2)

为您的类提供在第一个实例化时设置的静态bool,并在main()的开头检查它

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

答案 2 :(得分:2)

你可以做的一件事就是有一个像MyClass::enableConstruction()这样的静态方法,可以打开类中的静态标志。如果在此标志为false时调用c'tor,则它会抛出异常。这样你就会有一些运行时指示,有人违反了规则。

请注意,您应该小心初始化该静态标志。为了避免任何构造顺序问题,最好将它作为首次访问时初始化的单例。

答案 3 :(得分:0)

没有干净的方法来做到这一点。也许你可以采取一些措施来实现这一目标,但你不应该

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

答案 4 :(得分:0)

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

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

然后,主要使用中的第一行是主(真),它将从那里开始返回true,而在此之前它将返回false。

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

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

答案 5 :(得分:-1)

一种可能的方法是在main中实例化该类。即。

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

除此之外,这是一个棘手的,编译器特定的混乱。你想要实现什么目标?