Създаване на обект от клас с __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. Не знам какво означава това


person Rasmus    schedule 12.11.2015    source източник
comment
Какво е точното съобщение за грешка, което получавате?   -  person Jørgen Fogh    schedule 12.11.2015
comment
@JørgenFogh 'read' не е член на 'Part', идентификаторът 'read' не е намерен. И синтактичните грешки в коментара ми за отговора по-долу   -  person Rasmus    schedule 12.11.2015


Отговори (2)


Вашият клас MyClass е експортиран, следователно трябва да напишете във вашия main :

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

person dkg    schedule 12.11.2015
comment
Това ми дава синтактични грешки на клас PartExport MyClass : public data::anotherClass{. Синтактична грешка: ':', Синтактична грешка: публична, Синтактична грешка: липсва ';' преди '{', Синтактична грешка: липсва ';' преди ':'. И грешка, която казва, че MyClass използва недефиниран клас „Part::PartExport“ - person Rasmus; 12.11.2015
comment
Този макрос вече е там, съжалявам, че го пропуснах. Всички проблеми с компилацията са налице поради #include ‹file.h› какво може да означава това? - person Rasmus; 12.11.2015
comment
Когато препроцесорът срещне инструкция #include "file.h", можете да помислите, че той прави копиране/поставяне на file.h във вашия действителен файл, така че компилаторът да има всички дефиниции, от които се нуждае, за да компилира вашия файл. След това, ако включите инструкции за експортиране, докато искате да импортирате експортирани dll функции, ще имате някои проблеми ... - person dkg; 12.11.2015

Това, до което искате да получите достъп, НЕ е функция, а член-функция. Като такъв трябва да посочите на кой клас е член.

И тъй като не сте го декларирали като статичен, което би го направило подобен на функция, дори трябва да създадете един от вашите MyClass, преди да имате достъп до него. (Нестатичната функция има указател „this“, без екземпляр от вашия клас няма да има „this“)

Пространството от имена 'Part' е просто още една обвивка около вашия клас.

За да получите достъп до нещо в пространство от имена, трябва да направите нещо подобно:

Part::somethinginmynamespace

За да извикате функция в пространство от имена, което правите

Part::somefunction();

За достъп до статична членска функция, която използвате

Part::SomeClass::SomeStaticFunction();

За достъп до нестатична членска функция трябва да направите следното:

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

Ако получите грешки при дефиниране и компилаторът мисли, че това е име на клас, тогава дефинирането е недефинирано. Може би сте го поставили в коментар или главните/малките букви са грешни.

person A.Franzen    schedule 12.11.2015
comment
Първо исках да направя както dkg каза. Но тъй като не работеше и визуалното студио предложи да отидем директно към функцията, реших, че мога да го изпробвам. Не разпознава MyClass като клас. Той предлага Part::PartExport като клас в падащото меню от моя Main - person Rasmus; 12.11.2015
comment
Не бива да разчитате напълно на IntelliSense, който понякога е сериозно повреден. - person A.Franzen; 12.11.2015