代码之家  ›  专栏  ›  技术社区  ›  Jamie Hale

如何在DLL之间共享类

  •  0
  • Jamie Hale  · 技术社区  · 16 年前

    Foo.h和Foo.cpp位于何处,以便DLL链接并最终不会在内存中复制代码?

    这样做合理吗?

    [编辑] 全部的 下面的答案和评论-不仅仅是我标记的答案。谢谢大家的意见。

    3 回复  |  直到 16 年前
        1
  •  5
  •   John Dibling    16 年前

    通过DLL以类的形式提供功能本身就很好。但是,您需要小心地将interrface与实现分离开来。谨慎程度取决于DLL的使用方式。对于仍然是内部的玩具项目或实用程序,您可能甚至不需要考虑它。对于将由多个客户机在不知道哪个编译器下使用的dll,您需要非常小心。

    class MyGizmo
    {
    public:
      std::string get_name() const;
    private:
      std::string name_;
    };
    

    如果 MyGizmo 将会被第三方使用,这个课程会让你头痛不已。显然,私有成员变量是个问题,但是 get_name() std::string 的实现细节是其定义的一部分。该标准规定了 标准::字符串 realloc() 处理内部重新分配,而另一个可能有一个名为 buy_node() 或者别的什么。数据成员也是如此。一个实现可以使用3 size_t char* ,而另一个可能使用 std::vector . 关键是编译器可能会认为 标准::字符串

    解决这个问题的一个办法是 interfaces . 在DLL的公共标头中,声明一个抽象类,表示DLL提供的有用功能,以及创建该类的方法,例如:

    class MyGizmo
    {
    public:
      static MyGizmo* Create();
      virtual void get_name(char* buffer_alloc_by_caller, size_t size_of_buffer) const = 0;
      virtual ~MyGizmo();
    private:
      MyGizmo();  // nobody can create this except myself
    
    };
    

    …然后在DLL的内部,定义一个实际实现 我的小发明 :

    mygizmo.cpp:

    class MyConcreteGizmo : public MyGizmo
    {
    public:
      void get_name(char* buf, size_t sz) const { /*...*/ }
      ~MyGizmo() { /*...*/ }
    private:
      std::string name_;
    };
    
    MyGizmo* MyGizmo::Create()
    {
      return new MyConcreteGizmo;
    }
    

    这似乎是一种痛苦,是的。如果您的DLL只在内部由一个编译器使用,那么就没有理由去麻烦了。但是,如果您的DLL将被我的多个编译器内部使用,或者被外部客户机使用,那么这样做可以避免以后的主要麻烦。

        2
  •  2
  •   tyranid    16 年前
        3
  •  2
  •   Chris Becke    16 年前

    福住在哪里?在另一个dll中。

    合理吗?不是真的。

    如果您声明这样的类:

    类declspec(dllexport)Foo{。。。

    然后msvc将导出类的每个成员函数。但是,生成的dll非常脆弱,因为对类定义的任何微小更改,如果没有对每个消费dll进行相应的重新生成,则意味着消费代码将为工厂函数未执行的任何堆栈和堆分配分配不正确的字节数。同样,内联方法将编译成消费DLL并引用类的旧布局。

    如果所有DLL总是一起重建,那么继续。如果没有-不要:P