首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图书馆设计混乱..。“公共”/“私有”(模板)标题、库文件..?

图书馆设计混乱..。“公共”/“私有”(模板)标题、库文件..?
EN

Stack Overflow用户
提问于 2018-07-07 13:49:08
回答 1查看 225关注 0票数 0

我正试着写我的第一个(非常)小,目前只自用,库.在这个过程中,我遇到了一些问题,比如如何以逻辑的方式分离我的头/源代码/对象文件。

更确切地说,我正在编写一个小的模板化容器类,因此对于一个类,我必须在它的头中包含这个类的实现。

我有这样一个目录结构:

代码语言:javascript
复制
include/ - "public" .hh header files included by extern projects
src/ - .cc files for implementation (+ "private" .hh header files?)
lib/ - .o compiled library files linked by extern projects

我已经不确定这是否有意义了。在我的例子中,我还编写了一些模板容器类使用的帮助类,其中一个类似于迭代器。所以我有以下文件:

代码语言:javascript
复制
container.hh
container.cc
container_helper.hh
container_helper.cc
container_iterator.cc
container_iterator.hh

虽然我希望能够访问它们在外部项目中的功能(例如,递增迭代器),但对我来说,项目具体地使用它们的功能是没有意义的。

代码语言:javascript
复制
#include "container_iterator.hh"

现在,由于我希望项目能够使用容器类,所以我将"container.hh“和"container.cc”(由于模板必须包含在"container.hh“中)放入"include/”目录中,然后由其他项目包含。现在我的迷茫..。容器类需要访问助手类,但我不希望其他项目只包含助手类,因此将助手类也放在" include /“目录中似乎是错误的。相反,我会把它们放在"src/“中。但是如果我这样做了,那么要将这些包含在“include /收集器. do”中,我必须使用相对filepath。

代码语言:javascript
复制
#include "../src/container_iterator.hh"

但是现在,如果我将我的库“分发”到一个外部项目,即我只使"include/“目录对编译器可见,它就不会编译(?),因为”./src/容器_iterator.hh“不存在。还是编译容器类并将其作为库放入"lib/“中,然后由其他项目链接?但是即使这样,我是否仍然需要包括标题"container.hh",才能找到函数声明,这就导致了同样的问题?

基本上我在这里迷路了..。标准是怎么做到的?我可以

代码语言:javascript
复制
#include <vector>

,但是我不知道任何只包含std::vector::iterator的头,这样做是没有意义的。

在我扩张的某个时刻,我肯定是在胡说八道,但我找不到在哪里。我想我理解标题和库是什么/应该是什么,但是当涉及到如何为实际项目设计和/或“分发”它们时,我被困住了。我一直遇到这样的问题,即使我开始学习C++ (或其他任何语言),没有一本课程/书似乎从来没有解释过如何实现所有这些概念,只有当它们已经存在时如何使用它们。

编辑

澄清我的困惑(?)更多..。(这太长了,不能发表评论)我之前读过,没有把模板化类的实现放到头中,这就是为什么我意识到至少需要将"container.cc“放到include/ dir中。虽然我并不特别喜欢这一点,但至少对于外部用户来说,不包括".cc“文件应该是明确的。

我是否也认为这意味着将模板化的类编译到库中是没有意义的,因为所有的类都将被包括在内吗?(所以模板代码总是开源的?..that听起来不对?)

在这种情况下,我仍然想知道STL是如何实现的,向量是否在自己的头中声明和定义它的迭代器?或者我可以包含一个单独的向量头::迭代器,这样做就没有意义了?

希望我能清楚地解释我的意图,如果没有,请发表意见。谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-07 16:06:30

根据我的经验,处理问题的最常见方法是有带有模板声明和文档( .hh文件)的头文件,其中还包括带有模板定义的.inc.tcc (首选项)文件。我还建议将外部项目可能包含的所有文件保存在同一个文件夹中,但是如果您想保持整洁,请将您的.inc/.tcc文件放在include中的一个名为detail的文件夹中(如果您喜欢GNU,也可以使用bits )。把东西放进一个详细的文件夹,并使用一个奇怪的扩展应该会吓到用户。

要回答您的其他问题:由于C++模板的性质,您使用的模板部分的全部源必须在翻译单元(即。#include'd)、--您可以为有限的参数使用显式实例化 (不过,这对于容器来说通常并不有用)。因此,为了大多数目的,您必须分发模板的源代码,当然,(正如注释中提到的)“开放源代码”是关于许可,而不是源代码可见性。

至于标准库,让我们以<vector>为例。GNU C++库有一个vector文件,其中包括包含声明和文档的bits/stl_vector.h,以及包含定义的bits/vector.tcc。LLVM的libc++只有一个巨大的文件,但是将声明放在顶部(没有文档!)以及底部所有的定义。

最后,有许多开源C++库可以供您参考,以获得未来的灵感!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51223837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档