2015-11-12 4 views
0
//file.h 
# define PartExport __declspec(dllexport) 
namespace Part{ 

class PartExport MyClass : public data::anotherClass{ 
    MyClass(); 
    void read(); 
}; 
} 

Я хочу получить доступ к этой функции, выполнив следующие действия. Visual studio предлагает сделать «Part :: read();» и f12 к этой функции.Создание объекта из класса с __declspec (dllexport)

//main.cpp 
#include <file.h> 

int main(){ 

    Part::read(); 
    return 0; 
} 

Но при компиляции он жалуется на синтаксические ошибки, поскольку считает, что PartExport является именем класса. Как я могу получить доступ к этой функции или создать объект MyClass?

Редактирование: Я понял, что все синтаксические ошибки в классе происходят из #include. Я не знаю, что это значит

+0

Какое сообщение об ошибке вы получаете? –

+0

@ JørgenFogh 'read' не является членом 'Part', идентификатор 'read' не найден. И синтаксические ошибки в моем комментарии к ответу ниже – Rasmus

ответ

2

Ваш класс 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

+0

Это дает мне синтаксические ошибки в «классе PartExport MyClass: public data :: anotherClass {". Синтаксическая ошибка: ':', Синтаксическая ошибка: общедоступная, Синтаксическая ошибка: отсутствует ';' before '{', Синтаксическая ошибка: отсутствует ';' до ':'. И ошибка, указывающая на то, что MyClass использует неопределенный класс «Part :: PartExport» – Rasmus

+0

Этот макрос уже там, извините за то, что он вышел из него. Все проблемы с компиляцией существуют из-за #include , что это может означать? – Rasmus

+0

Когда препроцессор сталкивается с командой '#include" file.h "', вы можете подумать, что она делает копию/вставку 'file.h' в вашем фактическом файле, чтобы у компилятора были все необходимые ему определения для компиляции вашего файла. Затем, если вы включаете инструкции экспорта, тогда как вы хотите импортировать экспортированные DLL-функции, у вас возникнут проблемы ... – dkg

1

Что вы хотите получить, это НЕ функция, а функция-член. Таким образом, вы должны указать, к какому классу он принадлежит.

И, поскольку вы не объявили его статическим, что сделало бы его похожим на функцию, вам даже нужно создать экземпляр одного из ваших MyClass, прежде чем вы сможете получить к нему доступ. (Нестатическая функция имеет «этот» указатель, без экземпляра вашего класса не было бы этого «этого»)

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

Для доступа что-то в пространстве имен вы делаете что-то вроде этого:

Part::somethinginmynamespace 

Для вызова функции в пространстве имен вы

Part::somefunction(); 

Чтобы получить доступ к статическим memberfunction вы используете

Part::SomeClass::SomeStaticFunction(); 

Для доступа к нестатической функции-члену вы выполните:

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

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

+0

Я хотел сделать, как сказал первый dkg. Но так как это не работало, а визуальная студия предложила перейти непосредственно к функции, я думал, что смогу это испробовать. Он не распознает MyClass как класс. Он предлагает «Part :: PartExport» как класс в раскрывающемся меню из моего главного. – Rasmus

+0

. Вы не должны полностью полагаться на IntelliSense, что иногда сильно нарушается. –

Смежные вопросы