Создание объекта из класса с помощью __declspec (dllexport)

//file.h
# define PartExport __declspec(dllexport)
namespace Part{

class PartExport MyClass : public data::anotherClass{
MyClass();
void read();
};
}

Я хочу получить доступ к этой функции, выполнив это ниже. Visual studio предлагает сделать «Part :: read ();» и f12 для этой функции работает.

//main.cpp
#include <file.h>

int main(){

Part::read();
return 0;
}

Но при компиляции он жалуется на синтаксические ошибки, потому что считает, что PartExport — это имя класса. Как я могу получить доступ к этой функции или создать объект MyClass?

редактировать: я понял, что все синтаксические ошибки в классе происходят из #include. Я не знаю что это значит

0

Решение

Твой класс MyClass экспортируется, следовательно, вы должны написать в своем основном:

Part::MyClass myClass;
myClass.read();

Если вы хотите вызывать свою функцию так, как вы это делаете на самом деле, вы должны написать в своем file.h :

namespace Part{

void PartExport read();

}

Но в этом случае вы потеряете инкапсуляцию вашего класса.


Другое дело: чтобы создать свою DLL, вы должны указать __declspec(dllexport) экспортировать функцию в библиотеку.

Но когда вы используете его, вы не должны сообщать исполняемому файлу, что вы хотите экспортировать эту функцию, так как она уже была экспортирована в вашу библиотеку.

Я советую вам скомпилировать вашу dll, определяющую этот макрос в вашем проекте: PART_EXPORT_DLL

Тогда напишите это в своем file.h:

//file.h
#ifdef PART_EXPORT_DLL
#    define PartExport __declspec(dllexport)
#else
#    define PartExport __declspec(dllimport)
#endif
namespace Part{

class PartExport MyClass : public data::anotherClass{
MyClass();
void read();
};
}

И когда вы хотите импортировать его, обязательно не для определять PART_EXPORT_DLL

2

Другие решения

То, что вы хотите получить доступ, это не функция, а функция-член.
Таким образом, вы должны указать, к какому классу он принадлежит.

И поскольку вы не объявили его статическим, что сделало бы его похожим на функцию, вам даже нужно создать экземпляр одного из MyClass, прежде чем вы сможете получить к нему доступ. (Нестатическая функция имеет указатель ‘this’, без экземпляра вашего класса не было бы ‘this’)

Пространство имен ‘Part’ — это просто еще одна оболочка для вашего класса.

Чтобы получить доступ к чему-либо в пространстве имен, вы должны сделать что-то вроде этого:

Part::somethinginmynamespace

Для вызова функции в пространстве имен вы делаете

Part::somefunction();

Для доступа к статической функции-члену вы используете

Part::SomeClass::SomeStaticFunction();

Для доступа к нестатической функции-члену вы делаете:

Part::Someclass myinstance;
myInstance.myFunction();

Если вы получаете ошибки в определении, и компилятор считает, что это имя класса, тогда определение не определено.
Может быть, вы положили это в комментарии, или верхний / нижний регистр не так.

1

По вопросам рекламы [email protected]