延迟构造静态成员对象

时间:2016-08-12 23:12:11

标签: c++ constructor static delay

项目被编译成一个dll以注入可执行文件

该项目依赖于一个API,它在main()的最开始时初始化,如下所示:

int DLL_main()
{
    TheApi::Initialize();
    AnObject anObjectInstance;
    //..
}

有一个对象使用类似于此的类定义构造:

class AnObject()
{
    AnObject();
    ~AnObject();

    static ApiHelper apiHelperObject; //This object assists in making certain api features easier to use
}

//Inside AnObject.cpp

ApiHelper AnObject::apiHelperObject;

apiHelperObject的构造函数中,有一些API函数调用

注入dll后,没有任何反应(也没有错误信息)但是, 从apiHelperObject删除静态关键字时,一切正常

问题似乎是在 API初始化之前构建的静态成员

无法在TheApi::Initialize()的构造函数中调用apiHelperObject,因为有多个不同的api辅助对象,这会导致TheApi::Initialize()被多次调用

所以问题是:

在构造静态成员对象之前初始化api的最佳方法是什么?或者,延迟构建静态成员的最佳方法是什么?

优选地,不使用指针,因为语法不是特别受欢迎的

谢谢

1 个答案:

答案 0 :(得分:5)

在普通的标准C ++中,你总是可以通过使static对象作为访问器函数的本地来延迟它的初始化。

基本上,这是迈耶斯'单:

auto helper_object()
    -> ApiHelper&
{
    static ApiHelper the_object;
    return the_object;
}

这里,在标准C ++中,对象在第一次执行时通过声明进行初始化。

但是C ++标准并不主动支持动态库,更不用说DLL注入了。因此很难说这将如何发挥作用。小心线程问题。