[英]Creating object from class with __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。 我不知道那是什么意思
您的類MyClass
已導出,因此您應該在main中編寫:
Part::MyClass myClass;
myClass.read();
如果要像實際在main中那樣調用函數,則應在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();
如果在定義時出錯,並且編譯器認為這是一個類名,則該定義是未定義的。 也許您將其放在注釋中,或者大寫/小寫錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.