【问题标题】:Using third party classes in a C++ header file在 C++ 头文件中使用第三方类
【发布时间】:2011-06-29 22:19:59
【问题描述】:

假设有一个名为(包括命名空间)other::OtherClass 的第三方类。

这是头文件。

class MyClass {
  public:
    ...
  private:
    other::OtherClass other_class_;
    ...
}

如果这个头文件是在生产中发布的,这是否会被认为将实现暴露给客户端?

另一方面,在公共接口中使用第三方类是个好主意吗? (请注意,第二个示例不一定将该类保存到私有成员中。)

class MyClass {
  public:
    MyClass(const other::OtherClass& other_class);
    ...
  private:
    ...
}

在第一个示例中,客户端必须知道other::OtherClass 的大小并包含头文件。在第二个示例中,客户端需要能够构造other::OtherClass,如果没有提供工厂,则可能需要头文件。

做上面的例子有什么好的借口吗?

如果这几乎不是一个好主意,那么设计上述类的常用方法是什么?

【问题讨论】:

    标签: c++


    【解决方案1】:

    供应商必须通过他们提供的头文件向客户公开一些数量的库。

    话虽如此,有一些技术可以在实现中隐藏数据和功能。一种更常见的技术是提供公共代理类和工厂函数,它们只向客户端公开最少量的公共功能。

    关于您的第二个问题,最好在标头中使用指向第三方类型的引用和指针,因为您可以将头文件中的类型前向声明为:

    class other::OtherClass;
    

    需要实际包含第三方头文件。这不会向您的库的客户公开任何第三方详细信息。

    【讨论】:

    • 如果other是一个命名空间,前向声明不应该是namespace other { class OtherClass; }吗?
    【解决方案2】:

    使用公共标头界面,您应该尽可能做出最少的承诺并公开最少的细节。其他一切都应该是实现细节。

    我看不出有任何理由将您的接口与 3rd 方类紧密耦合,即使您不打算在未来更换供应商。

    在设计界面/实现时需要考虑很多事情。你可以参考design patterns book

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多