- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在F.B.开设的C++半年类(class)中Brokken(The C++ Annotations的作者),我们被教导使用所谓的实现 header 。我知道这是弗兰克的惯例,但我从没看过其他地方。因此,我将解释这个概念,并且我很好奇其他人对此的看法。
这个想法是,您只需将类成员的实现的实现所需的所有#include
指令(假设您未编写类中的定义)放入一个文件,.ih实现 header ,并将此文件#include
放入而是每个源文件。替代品是
1)#include
类标题中的所有内容或
2)在每个源文件中分别对所有 header #include
编码。
两种选择的缺点都很明显:
1a)您必须在添加任何需要一些其他#include
的内容之后,重新编译所有源#include
到此 header 。
1b)您的头文件(应该是类的清晰接口(interface))被一大堆#include
指令污染了,用户不知道该指令的用途,他也不在乎。
2a)您必须在每个源文件中一次又一次地对相同的 header #include
。
2b)您的实现受到所有这些#include
的污染,使其看起来有些困惑。
只是要清楚:
/* someclass.h(pp) */
#ifndef SOME_CLASS_H
#define SOME_CLASS_H
class SomeClass
{
//some private data members
public:
SomeClass();
void sayHi() const;
// some more member functions
private:
// some private member functions
};
#endif
/* someclass.ih */
#include "someclass.h"
#include <iostream>
#include <vector>
using namespace std;
// namespace is now only used in my implementations, other people
// including my headers won't accidentally import the entire std namespace.
/* sayhi.cc */
#include "someclass.ih"
void SomeClass::sayHi() const
{
cout << "sayHi() says hi!\n";
}
最佳答案
有趣的帖子。让我首先评论关于.ih header 的user1428839的声明(以下称为发帖人):
首先,海报写道:
...The idea is that you just put all #include directives that are needed by the implementations of your class-members' implementations ... in one file, the .ih implementation header, and #include this file in every source file instead.
someclass.h
)仅提供接口(interface),并且仅应声明可以声明的内容。因此,如果
SomeClass
具有类数据成员
std::ofstream *d_out
,则无需
#include <fstream>
。相反,它足以满足
#include <iosfwd>
的要求。这将产生一个干净的类接口(interface),当不属于但仅使用
SomeClass
的源包含它时,可将其编译时间降至最低。
1a) You have to recompile all sources #include'ing this header after adding anything that requires some additional #include's.
1b) Your header file, that is supposed to be a clear interface of your class, gets polluted with a great bunch of #include directives of which the user has no idea what they are used for, nor does he care.
someclass.h
时,编译器还必须读取所有这些附加头,以及那些头所包含的头等,而编译器仅需要知道
SomeClass
的本质。谚语是用户不必为自己不需要的东西付费,在这种情况下,由于编译器不得不读取(通常是很多)无用的(在
SomeClass
的情况下)头文件而导致的额外编译时间。
关于c++ - 有人熟悉 “implementation/internal header”(* .ih)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11063355/
我无法熟悉 Windows7 上的 XAMPP 界面(只有之前的经验是使用 HTML、C、C++)。如何继续在 PHP 和 MySQL 中开始开发工作并使用 Apache Server 测试开发的内容
我最近加入了一个 Perl 项目,我需要快速开始使用代码库进行工作。但是,我发现我陷入了困境,因为我不知道我需要更改哪里或代码的所有部分如何组合在一起。 要熟悉您没有经验的 Perl 代码库,您有哪些
我有一个 friend 拥有自己的软件咨询业务。他的员工从事的大部分工作都是与 .NET 相关的开发。他已经离开实际开发多年,一直专注于建立自己的业务。他问我熟悉整个.NET平台和.NET下开发的最好
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
在 previous question 中,我有一种玩具语言的类型 data Type : Set where Nat : Type Prp : Type 我考虑过使用不相交的并集来解释它们
当写这样简单的东西时: import java.util.Scanner; public class Practice { public static void main(String[]
经过多年的关系数据库打交道,我很舒服地被洗脑成规范化地思考表、列和行。 Cassandra 仍然让我无法完全理解它。 我理解它更多的是持久化映射,您只能查询这些映射的唯一键,但我的理解是不完整的。 是
在编写 PHP 代码时,我决定从意大利式代码转向尝试实现 MVC。为了实现 MVC 框架,我发泄到 this article文章开了个好头,我设法创建了我的网站,并开发了前端。现在,我正在尝试使用 s
[摘自 this question ,非正式性较低。] 新手 Cocoa 程序员应该将哪些内容作为示例项目编写,而不是在教程的指导范围内? 让我们为每个答案提供一个项目创意。如果您有多个建议,请发布多
情况 我正在尝试熟悉 Java 中的线程。出于这个原因,我修改了我在一本书中找到的程序列表。所做的事情非常简单: 它创建一个包含 100.000.000 个元素的 boolean[] 数组。 它使用
我是一名优秀的程序员,十分优秀!