【问题标题】:Creating object from class with __declspec(dllexport)使用 __declspec(dllexport) 从类创建对象
【发布时间】:2016-02-13 13:54:32
【问题描述】:
//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 的对象?

edit:我意识到类上的所有语法错误都来自 #include 。我不知道这是什么意思

【问题讨论】:

  • 您得到的确切错误信息是什么?
  • @JørgenFogh 'read' 不是'Part' 的成员,未找到'read' 标识符。以及我对以下答案的评论中的语法错误

标签: c++ visual-studio dllexport declspec


【解决方案1】:

您的课程 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

【讨论】:

  • 这给了我关于“class PartExport MyClass: public data::anotherClass{”的语法错误。语法错误:':',语法错误:public,语法错误:缺少';'在'{'之前,语法错误:缺少';'前 ':'。还有一个错误说 MyClass 使用了一个未定义的类 'Part::PartExport'
  • 那个宏已经在里面了,很抱歉漏掉了。由于#include ,所有编译问题都存在,这意味着什么?
  • 当预处理器遇到#include "file.h" 指令时,您可以认为它会在您的实际文件中复制/粘贴file.h,因此编译器将拥有它需要的所有定义编译你的文件。然后,如果你包含导出指令,而你想导入 dll 导出的函数,你会遇到一些麻烦......
【解决方案2】:

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

而且由于您没有将其声明为静态的,这会使它类似于函数,您甚至必须先实例化您的 MyClass 之一,然后才能访问它。 (非静态函数有一个“this”指针,没有你的类的实例就没有“this”)

命名空间“Part”只是您的类的另一个包装器。

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

Part::somethinginmynamespace

要调用命名空间中的函数

Part::somefunction();

要访问您使用的静态成员函数

Part::SomeClass::SomeStaticFunction();

要访问非静态成员函数:

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

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

【讨论】:

  • 我想像 dkg 首先说的那样做。但是由于它不起作用并且视觉工作室建议直接使用该功能,我认为我可以尝试一下。它没有将 MyClass 识别为一个类。它建议“Part::PartExport”作为我的 Main 下拉菜单中的类
  • 你不应该完全依赖 IntelliSense,它有时会被严重破坏。
猜你喜欢
  • 2018-08-05
  • 2016-03-25
  • 1970-01-01
  • 2023-01-26
  • 2015-02-24
  • 2016-02-01
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
相关资源
最近更新 更多