Импорт / экспорт одноэлементного класса между несколькими файлами - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь создать потокобезопасный синглтон-класс (MySingleton).Ah содержит объявление, а A.cpp имеет определения.Мне нужно использовать этот одноэлементный объект в B.cpp и C.cpp, которые компилируются в разные библиотеки DLL.В B.cpp я хочу установить переменную ptrval, а в C.cpp я получаю переменную ptrval.

В А *

class MySingleton {
public:

    static MySingleton* getInstance();
    void setval(int* uid);
    int* getval();


private:
    MySingleton() = default;
    ~MySingleton() = default;
    MySingleton(const MySingleton&) = delete;
    MySingleton& operator=(const MySingleton&) = delete;
    int* ptrval = nullptr;
    static MySingleton* instance;
};

#ifdef MySingleton_DLLEXPORT
extern __declspec(dllexport) int* ptrval = nullptr;
extern __declspec(dllexport) MySingleton* getInstance();
extern __declspec(dllexport) void setval(int* uid);
extern __declspec(dllexport)  int* getval();
extern __declspec(dllexport)  MySingleton* instance = 0;
#else
extern __declspec(dllimport) int* ptrval;
extern __declspec(dllimport) MySingleton* getInstance();
extern __declspec(dllimport) void setval(int* uid);
extern __declspec(dllimport)  int* getval();
extern __declspec(dllimport)  MySingleton* instance;
#endif

В A.cpp

#pragma push_macro("MySingleton_DLLEXPORT")
#define MySingleton_DLLEXPORT
#include <A.h>
#pragma pop_macro("MySingleton_DLLEXPORT")

MySingleton* MySingleton::instance;

MySingleton*  MySingleton::getInstance()
{
    if (instance == 0)
        instance = new MySingleton();
    return instance;
}

void MySingleton::setval(int* uid) {
    this->ptrval = uid;
}

int* MySingleton::getval() {
    return this->ptrval;
}

В B.cpp

#pragma push_macro("MySingleton_DLLEXPORT")
#include <A.h>
#pragma pop_macro("MySingleton_DLLEXPORT")

int* uid = (getting uid from a function)
(MySingleton::getInstance())->setval(uid);

В C.cpp

#pragma push_macro("MySingleton_DLLEXPORT")
#include <A.h>
#pragma pop_macro("MySingleton_DLLEXPORT")

ptrval = (MySingleton::getInstance())->getval();

Я получаю следующую ошибку компоновки: B.obj: ошибка LNK2019: неразрешенный внешний символ "public: статический класс MySingleton * __cdecl MySingleton :: getInstance (void)"

Любая помощь будетоценили!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...