Создание объекта из класса с помощью __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, прежде чем вы сможете получить к нему доступ. (Нестатическая функция имеет указатель «этот», без экземпляра вашего класса не было бы «этого»)

Пространство имен «Часть» — это просто еще одна оболочка вокруг вашего класса.

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

Part::somethinginmynamespace

Чтобы вызвать функцию в пространстве имен, которое вы делаете

Part::somefunction();

Чтобы получить доступ к статической функции-члену, которую вы используете

Part::SomeClass::SomeStaticFunction();

Чтобы получить доступ к нестатической функции-члену, вы делаете:

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

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

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