Jak zaimplementować Singleton w aplikacji z DLL

Mam aplikację (w MS Visual Studio), która zawiera 3 projekty:

Główny (ten, który zawieramain funkcjonować)urządzenie (modele niektórych urządzeń sprzętowych)config (zawiera pewną konfigurację dla obu innych projektów)

Wykres zależności to:

Główny zależy odurządzenie, od którego zależyconfigGłówny zależy odconfig

Theconfig projekt zawiera Singleton, który zawiera niektóre parametry konfiguracyjne.

Postanowiłem włączyćurządzenie projekt do biblioteki DLL. Kiedy to zrobiłem, wydaje mi się, że mam dwa wystąpienia Singletona wconfig projekt! Myślę, że to klasyczny problem, który może mieć dobre rozwiązanie. Jak mogę to naprawić?

Powtórzyłem problem za pomocą następującego (stosunkowo małego) kodu. Oczywiście w moim przypadku jest około 30 projektów, nie tylko 3. Chciałbym zrobić tylko 1 DLL (jeśli to możliwe).

<code>// 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];
}
</code>
<code>// 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';
}
</code>
<code>// 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';
}
</code>

Wydajność:

Przed inicjalizacją w aplikacji: jeden = 0

Po inicjalizacji w aplikacji: jeden = 1

Urządzenie działa: dwa = 0

Po pracy w aplikacji: dwie = 2

Kilka wyjaśnień na temat tego, co robi kod i dlaczego:

Rozpoczyna się główna aplikacjaPierwszy wydruk ma pokazać, że singleton nie jest jeszcze zainicjowanyGłówna aplikacja inicjalizuje singletonPierwszy wydruk pokazuje, że inicjalizacja zadziałałaGłówna aplikacja uruchamia „urządzenie sprzętowe”Wewnątrz biblioteki DLL singleton nie jest inicjowany! Spodziewam się, że wyjdzietwo = 2Ostatni wydruk pokazuje, że singleton jest nadal inicjowany w głównej aplikacji

questionAnswers(3)

yourAnswerToTheQuestion