使用__declspec(dllexport)从类创建对象

时间:2015-11-12 09:25:26

标签: c++ visual-studio dllexport declspec

//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。我不知道这意味着什么

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您要访问的不是函数,而是成员函数。 因此,您必须指定它所属的类。

由于你没有声明它会使它与函数类似,所以你甚至必须先实例化一个MyClass才能访问它。 (一个非静态函数有一个'this'指针,没有你的类的实例就没有'this')

名称空间“Part”只是您班级的另一个包装。

要访问命名空间中的某些内容,您可以执行以下操作:

Part::somethinginmynamespace

要调用名称空间中的函数

Part::somefunction();

要访问静态成员函数,请使用

Part::SomeClass::SomeStaticFunction();

要访问非静态成员函数,请执行以下操作:

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

如果在定义上出现错误,并且编译器认为它是类名,那么定义是未定义的。 也许你把它放在评论中,或者大写/小写是错误的。