第1部分:我有一个非常奇怪的情况,在其中,我必须得到在main()之前或者进入main()之前调用的几个类的构造函数。还有另一个子系统需要该子系统的ASAP main()数据启动和更多东西,这使得这个概念看起来更有用。
我有两种方法:
在main()之前使用全局对象。
在main()的第一行使用静态类定义。
另一个想法是(因为我使用gcc)是使用attribute __constructor__
gcc保留函数。
你会建议什么?
第2部分:为了进一步解决这个问题,我需要解开这些类的开发。(这更多是代码库设计问题。)
也就是说,如果某人正在编写 classA 而其他人正在编写 classB ,那么我们将有两个单独的文件 classA , classB ,定义并在其文件/模块中调用自己的构造函数。
这是一个示例代码,说明了我的想法:
class Init_myclass
{
public:
Init_myclass(): myvar(10)
{
std::cout << __PRETTY_FUNCTION__ << ":" << myvar << std::endl;
};
private:
int myvar;
};
static Init_myclass TestInit; //Initializing object prior to main
int main ()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
//Use the data populated by the Init_myclass constructor
return 0;
}
在上面的代码中,将 Init_myclass 替换为100个类定义,例如 classA,classB 等。
另一种方法是使用文件中的单个构造函数从内部调用在其他文件中定义的多个类构造函数。
以下示例代码可以帮助您理解我的想法:
class InitializeOne
{
public:
InitializeOne(): myvar(10)
{
std::cout << __PRETTY_FUNCTION__ << ":" << myvar << std::endl;
A bunch of constructors of other classes here();
classA();
classB();
....
};
private:
int myvar;
};
int main()
{
static InitializeOne TestInit;//Object after main
... //functions depending on data populated by Initialize constructor
}
类的初始化顺序无关紧要,但必须在main之前或进入main之后初始化。
哪种设计更可取?为什么?
我希望,我的问题是可以理解的。如果没有,请告诉我,我错过了哪些信息或过度简化/复杂等等。
感谢您的回复和时间。
答案 0 :(得分:1)
如果可能,您应该选择接近2.
创建一个单例类:
class InitializeOnce {
public:
static InitializeOnce& getInstance()
{
static InitializeOnce theInstance;
return theInstance;
}
virtual ~InitializeOnce() {}
classA& getClassA() { return classA_; }
classB& getClassB() { return classB_; }
private:
classA classA_;
classB classB_;
InitializeOnce()
: classA_()
, classB_()
{
}
InitializeOnce(const InitializeOnce& rhs); // Prohibit copying!
InitializeOnce& operator=(const InitializeOnce& rhs); // Prohibit assigning!
};
...并从主要访问一次:
int main()
{
static InitializeOnce& theInstance = InitializeOnce::getInstance();
// ... functions depending on data populated by Initialize constructor
}
如果接近1.这将是:
static InitializeOnce& theInstance = InitializeOnce::getInstance();
int main()
{
// ... functions depending on data populated by Initialize constructor
}
注意强>
你提出的方法将导致不同的行为,因为函数本地静态变量保证在至少第一次访问它们之前被实例化,如果你真的需要访问它在调用 main()之前你必须选择方法1。
恕我直言,应该避免你的第三个想法,编译器特定的属性定义(即使它的gcc),将使代码不那么便携。