C ++ Public API的最佳做法是什么?
我正在开发一个C ++项目,它有多个名称空间,每个名称空间都有多个对象。某些对象具有相同的名称,但位于不同的名称空间中。目前,每个对象都有自己的.cpp文件和.h文件。我不确定如何说这个...是否适合创建第二个.h文件以仅公开公共API?它们应该是每个命名空间,每个对象还是其他范围的.h文件?为C ++库创建公共API的最佳做法是什么?
感谢您的帮助, Chenz
答案 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
的命名约定来明确标识文件中的类。