gpt4 book ai didi

c++ - 如何在带有 DLL 的应用程序中实现单例

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:55:27 26 4
gpt4 key购买 nike

我有一个包含 3 个项目的应用程序(在 MS Visual Studio 中):

  • ma​​in(包含 main 函数的那个​​)
  • device(模拟一些硬件设备)
  • config(包含其他两个项目的一些配置)

所以依赖图是:

  • ma​​in依赖于device,而device又依赖于config
  • ma​​in 依赖于config

config 项目包含一个 Singleton,其中包含一些配置参数。

我决定将device 项目变成一个DLL。当我这样做时,似乎我在 config 项目中得到了 Singleton 的两个实例!我想这是一个经典问题,可能有一个很好的解决方案。那么我该如何解决这个问题呢?

我用以下(相对较小的)代码重现了这个问题。当然,就我而言,有大约 30 个项目,而不仅仅是 3 个。我只想制作 1 个 DLL(如果可能的话)。


// config.h
#pragma once
#include <string>
#include <map>
class Config
{
public:
static void Initialize();
static int GetConfig(const std::string& name);

private:
std::map<std::string, int> data;
};

// config.cpp
#include "config.h"

static Config g_instance;

void Config::Initialize()
{
g_instance.data["one"] = 1;
g_instance.data["two"] = 2;
}

int Config::GetConfig(const std::string& name)
{
return g_instance.data[name];
}

// device.h
#pragma once

#ifdef _DLL
#define dll_cruft __declspec( dllexport )
#else
#define dll_cruft __declspec( dllimport )
#endif

class dll_cruft Device
{
public:
void Work();
};

// device.cpp
#include "device.h"
#include <iostream>
#include "config.h"

void Device::Work()
{
std::cout << "Device is working: two = " << Config::GetConfig("two") << '\n';
}

// main.cpp
#include <iostream>
#include "config.h"
#include "device.h"

int main()
{
std::cout << "Before initialization in application: one = " << Config::GetConfig("one") << '\n';
Config::Initialize();
std::cout << "After initialization in application: one = " << Config::GetConfig("one") << '\n';
Device().Work();
std::cout << "After working in application: two = " << Config::GetConfig("two") << '\n';
}

输出:

Before initialization in application: one = 0

After initialization in application: one = 1

Device is working: two = 0

After working in application: two = 2

关于代码的作用和原因的一些解释:

  1. 主应用程序启动
  2. 第一次打印只是为了表明单例还没有初始化
  3. 主应用初始化单例
  4. 第一次打印表明初始化成功
  5. 主应用启动“硬件设备”
  6. 在 DLL 内部,单例未初始化!我希望它输出 two = 2
  7. 最后的打印显示单例仍在主应用程序中初始化

最佳答案

当我遇到同样的问题时,我通过创建另一个 DLL 来解决它,该 DLL 的唯一目的是管理单例实例。所有试图获取指向单例的指针的尝试都会调用这个新 DLL 中的函数。

关于c++ - 如何在带有 DLL 的应用程序中实现单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10520587/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com