C ++ Public API的最佳实践是什么?

时间:2009-11-08 23:21:31

标签: c++ api

C ++ Public API的最佳做法是什么?

我正在开发一个C ++项目,它有多个名称空间,每个名称空间都有多个对象。某些对象具有相同的名称,但位于不同的名称空间中。目前,每个对象都有自己的.cpp文件和.h文件。我不确定如何说这个...是否适合创建第二个.h文件以仅公开公共API?它们应该是每个命名空间,每个对象还是其他范围的.h文件?为C ++库创建公共API的最佳做法是什么?

感谢您的帮助, Chenz

5 个答案:

答案 0 :(得分:2)

有时在每个.cpp和.h文件对中都有一个类,并将命名空间层次结构作为目录层次结构。 例如,如果你有这个类:

namespace stuff {
  namespace important {
    class SecretPassword 
    {
       ...
    };
  }
}

然后它将在两个文件中:

/stuff/important/SecretPassword.cpp
/stuff/important/SecretPassword.h

另一种可能的布局可能是:

/src/stuff/important/SecretPassword.cpp
/include/stuff/important/SecretPassword.h

答案 1 :(得分:2)

天儿真好,

一个建议是看一下Handle-Body的C ++习语,有时也被称为Cheshire Cat。这是包含成语的James Coplien's original paper

这是一种众所周知的方法,用于将公共API与实现分离。

HTH

答案 2 :(得分:1)

我会说你最好决定,这就是“图书馆”的类型。

您的API是否提供了一个“操作”?或只处理一个抽象的“数据类型”?这方面的例子是zlib和libpng。两者都只有一个标题,它提供了执行库所需的所有内容。

如果您的库是不相关(或甚至相关)类的集合,它们是否具有相同的目标,那么为每个子集提供它自己的标题。这方面的主要例子就是提升。

答案 3 :(得分:0)

很好的回应LiraNuna。

您是否向应用程序或库提供API?

应用程序API通常只提供查询应用程序状态或尝试更改该状态的方法。在这种情况下,您通常在单独的头文件中有单独的接口声明。然后,您的对象将实现此接口以处理API请求。

库通常会显示可以重复使用的对象。在这种情况下,一般来说,您的API只是头文件中的公共方法。

答案 4 :(得分:0)

我同意doc所说的 - 每个文件一个类。 99.9%的时间!

另外,请考虑使用哪些文件名。在不同的目录中有多个相同名称的标题通常是个坏主意,即使它们包含的类可能位于不同的名称空间中。

特别是如果这是一个公共API,您可能无法控制库的用户定义的包含路径,因此构建可能会找到错误的路径。调整包含路径的顺序肯定是我推荐的解决方案!

我们使用Namespace-Class.h的命名约定来明确标识文件中的类。