У меня есть файлы * .cpp и * .hpp с классом, имеющим следующую структуру:
class FirstClass{
public:
FirstClass();
~FirstClass();
SHORT FirstMethod(arguments ...);
void SecondMethod(arguments ...);
ULONG thirdMethod(arguments ...);
....
void lastMethod();
private:
std::list<std::string> STLStringList;
};
Я пытаюсь экспортировать мой основной класс из DLL и использую функции из моего вложенного класса (класс FirstClass). Я создаю основной класс, имеющий следующую структуру:
#ifdef MAINCLASSDLL_EXPORTS
#define MAINCLASS_API __declspec(dllexport)
#else
#define MAINCLASS_API __declspec(dllimport)
#endif
// This class is exported from the MainClassDll.dll
class MAINCLASS_API MainClassDll{
public:
MainClassDll();
// Methods from class FirstClass
virtual SHORT FirstMethod(arguments ...);
virtual void SecondMethod(arguments ...);
virtual ULONG thirdMethod(arguments ...);
....
virtual void lastMethod();
};extern "C"{
MAINCLASSDLL_API MainClassDll *CreateObject();
MAINCLASSDLL_API void DestroyObject(MainClassDll *pobjMainClassDll );
}
Методы из FirstClass используют закрытый STLStringList, и все методы должны использовать один и тот же объект FisrtClass. Я пытаюсь создать метод, который экспортирует указатель на объект FirstClass, но когда я пытаюсь использовать эти методы, моя программа падает. Я не могу изменить структуру FirstClass.
Возможно ли создать проект DLL для используемых методов из моего вложенного класса, не мешая вложенному классу?
Мне кажется, что вы хотите большую часть FistClass
Класс private внутри DLL, как своего рода внутренняя структура, но все же экспортирует некоторые функции из нее. Это можно решить с помощью наследства: вы делаете публичным MainClassDLL
абстрактный базовый класс, а затем иметь FirstClass
наследовать от MainClassDLL
,
Что-то вроде
struct MainClassDLL
{
virtual SHORT FirstMethod(arguments ...) = 0;
virtual void SecondMethod(arguments ...) = 0;
virtual ULONG thirdMethod(arguments ...) = 0;
....
virtual void lastMethod() = 0;
virtual ~MainClassDLL() {}
};
// In private header file
class FirstClass : MainClassDLL
{
public:
FirstClass();
virtual ~FirstClass();
SHORT FirstMethod(arguments ...);
void SecondMethod(arguments ...);
ULONG thirdMethod(arguments ...);
....
void lastMethod();
private:
// Private data
};
Тогда CreateObject
Функция просто создает экземпляр FirstClass
и возвращает его как указатель на MainClassDLL
,