簡體   English   中英

使用__declspec(dllexport)從類創建對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM