想象一下,我有一个名为C++的类MyClass.
想象一下,我无法访问它的源代码MyClass...它包含在一个库中,我只提供了库和头文件MyClass.
想象一下,类本身需要环境预配置...例如......在可以调用类的构造函数之前,我需要做一些设置.该类通常用于如下:
void func() {
doGlobalSetup();
MyClass myInstance(1,2,3);
myInstance.doSomething();
...
}
Run Code Online (Sandbox Code Playgroud)
现在我遇到了需要创建类的全局实例的情况,例如:
MyClass myInstance(1,2,3);
int main(int argc, char *argv[]) {
doGlobalSetup();
myInstance.doSomething();
}
Run Code Online (Sandbox Code Playgroud)
问题是在这个故事中,实例MyClass是在调用之前创建的doGlobalSetup().它在main()被调用之前被实例化.我想要做的是要么推迟创建myInstance() 直到稍后,要么能够doGlobalSetup()在类的实例化之前以某种方式运行.
这是对实际故事的简化......所以让我们假设:
MyClass.myInstancetype 的实例变量MyClass(我无法将逻辑更改为MyClass *pMyInstance).非常感谢阅读.
因为你已经限制了new无法使用的问题.您应该能够始终创建对象并将其复制到全局实例.例如:
MyClass createMyClass()
{
doGlobalSetup();
return MyClass(1, 2, 3);
}
MyClass myInstance = createMyClass();
int main()
{
myInstance.doSomething();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在 GCC 编译器环境中,有一个名为 的函数属性功能 constructor 。这允许我们标记一个函数定义,使其能够在调用 main之前,最重要的是在调用任何类构造函数之前自动调用它。
回顾最初的问题定义......如果doGlobalSetup()函数修改自:
void doGlobalSetup() { ... }
Run Code Online (Sandbox Code Playgroud)
到
__attribute__((constructor)) void doGlobalSetup() { ... }
Run Code Online (Sandbox Code Playgroud)
那么它的调用将在调用 main 之前以及调用任何静态类实例构造函数之前发生。对该函数的显式调用也将从 main() 中删除,因为它的工作已隐式执行。