//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. Я не знаю что это значит
Твой класс 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
То, что вы хотите получить доступ, это не функция, а функция-член.
Таким образом, вы должны указать, к какому классу он принадлежит.
И поскольку вы не объявили его статическим, что сделало бы его похожим на функцию, вам даже нужно создать экземпляр одного из MyClass, прежде чем вы сможете получить к нему доступ. (Нестатическая функция имеет указатель ‘this’, без экземпляра вашего класса не было бы ‘this’)
Пространство имен ‘Part’ — это просто еще одна оболочка для вашего класса.
Чтобы получить доступ к чему-либо в пространстве имен, вы должны сделать что-то вроде этого:
Part::somethinginmynamespace
Для вызова функции в пространстве имен вы делаете
Part::somefunction();
Для доступа к статической функции-члену вы используете
Part::SomeClass::SomeStaticFunction();
Для доступа к нестатической функции-члену вы делаете:
Part::Someclass myinstance;
myInstance.myFunction();
Если вы получаете ошибки в определении, и компилятор считает, что это имя класса, тогда определение не определено.
Может быть, вы положили это в комментарии, или верхний / нижний регистр не так.