【问题标题】:What is the best way to expose internal classes to public API?将内部类公开给公共 API 的最佳方式是什么?
【发布时间】:2015-10-22 14:48:03
【问题描述】:

我有一个使用另一个库 (dll) 中的类的库

//DLL External library API: Foo library
namespace foo{
class Component( Elemement e ) {
...
}
} //foo namespace

现在我的库需要使用 foo dll 并使用它的一些功能和类,但不暴露 Foo 库类型而是一些“翻译”

// my developed library "Core"
namespace core{
class Component( Element e ){
...
}
}

公共 API 将公开类 core::Component 和 core::Element,但实际上这些应该是对 foo::Component 和 foo::Element 的直接翻译。还想象一下,对于需要包装以公开的许多其他类,需要进行这种转换。 处理此问题的最佳方法是什么?

【问题讨论】:

  • 你写“翻译”是什么意思?
  • 我需要一个与 foo::Element 完全相同的类 core::Element,我只是不想公开 foo 类而是它的一个 wapper。在这种情况下,包装器只是隐藏底层类不是在我的库中开发的,而是在外部库(foo)中开发的,有什么技巧可以做吗?像 typedefs,还是使用(在 c++11 中)?
  • 如果是一样的,为什么要隐藏呢?
  • 不同的客户,提供相同的功能。
  • 听起来你想要一个 PIMPL:stackoverflow.com/questions/60570/…

标签: c++ api class interface


【解决方案1】:

using 指令是您要查找的吗?

namespace foo {
    class A {};
}

namespace core {
    using foo::A;
}

// use like
core::A a;

【讨论】:

  • 如果类 A 有方法 getValue() 和 setValue(),例如,我的库的最终用户将如何看到这些?如果我使用您的解决方案并且不公开 foo 库中的标头,这怎么可能?
  • @FCR,如果您不想复制库头文件,无论如何都必须公开它们。
  • 谢谢,如果 Foo 库(和标头)包含许多我不希望客户使用的其他公共类,该怎么办。由于我希望客户使用 Foo 库但通过我的核心库,通过发送 Foo 标头和库,我让用户使用 Foo 的全部功能,避免使用我的核心库,对吗?是否可以只发送 Foo 的所有标头的一个子集?
猜你喜欢
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 2012-05-10
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多