C ++包含头问题

时间:2011-02-07 01:34:11

标签: c++

我是c / c ++的新手,我对以下内容感到困惑:

  1. 我是否应该将类声明放在自己的头文件中,并将实际实现放在另一个文件中?
  2. 我是否应该在example.h文件或example.cpp文件中放置<iostream>之类的标题?
  3. 如果所有类都需要使用<iostream>,并且我将一个类的头文件包含在另一个类的标题中,是否意味着我将<iostream>包含两次?
  4. 如果我使用很多STL课程,使用std::
  5. 的好习惯是什么?

6 个答案:

答案 0 :(得分:8)

  

1.我是否应该将类声明放在自己的头文件中,   并在另一个实际实施   文件?

如果您正在操作模板,则可以在同一个头文件中分别编写类的定义和类成员的定义。此外,如果要使您的成员内联函数,您可以在类定义本身内定义它们。在任何其他情况下,最好将类(.hpp文件)的定义与类(.cpp)的成员定义分开。

  

2.我是否应该在example.h文件或example.cpp中添加标题   文件?

取决于您是否只需要example.h文件或.cpp文件中的那些标题。

  

3.如果所有类都需要使用,我将一个类的头文件包含进去   另一个班级的标题,这是否意味着我   包括两次?

如果您没有通过以下宏包装类定义,则会发生这种情况:

#ifndef FOO_HPP
#define FOO_HPP
class { 
...
};
#endif
  

5.如果我使用很多STL课程,使用std ::?

的好习惯是什么

我认为每次只能使用std::代替using namespace std时更好。这样,您将只使用您需要的命名空间,并且您的代码将更具可读性,因为您将避免命名空间冲突(想象两个具有相同名称且属于两个不同命名空间的方法)。

但最重要的是问题4在哪里呢?

答案 1 :(得分:2)

  1. 一般来说,是的。它有助于组织。但是,在小型项目上,这可能不是什么大不了的事。

  2. 我在这里无法理解这个问题。如果您要问放置#include指令的位置,则实现文件应包含头文件。

  3. 是的,但使用include guards可以防止多次包含。

答案 2 :(得分:2)

  1. 您通常应该,但对于相对较小的项目,您可能会尽可能避免使用实施文件;
  2. 如果您的标题仅使用<iostream>中的不完整类型,则可以避免将其包括在内,但对于这些类型,您需要forward declarations(请参阅When to use forward declaration?)。然而,为简单起见,如果类型使用模板,我通常会包含相应的标题;
  3. 否。 include guards保证标头仅在同一translation unit;
  4. 中包含一次
  5. 一个常见的好习惯是不将using namespace std放在头文件中。也要注意名称空间冲突;

答案 3 :(得分:1)

通常,您会将类声明(包括成员声明)放入源文件中的头文件和成员函数(方法)的定义中。标头通常包含*.h*.hpp等名称。对于第3点,你应该在你的标题中放入包含警戒,以便它们可以安全地包含在同一个源文件中;然后你可以把它们包含在你需要的任何地方。我不明白第5点:您是否在询问何时使用std::命名空间资格?

答案 4 :(得分:1)

对于“包含两次”的问题,以下是头文件的常见模式:

// _BLAHCLASS_H_ should be different for each header, otherwise things will Go Bad.
#ifndef _BLAHCLASS_H_
#define _BLAHCLASS_H_

... rest of header ...

#endif

答案 5 :(得分:1)

  1. 只要它们不是模板,通常是的。模板(无论好坏)必须放在标题中。
  2. 我更喜欢让我的每个标题“独立”,所以如果它需要任何其他标题来运行,它包含该标题本身(例如,如果我有一个使用std::string的类,标题该课程将#include <string>
  3. 否。除了一些特殊的例外情况,标准标题需要编写,因此您可以多次包含它们而不更改任何内容(主要的例外是assert.h / cassert,包含它是有意义的不止一次)。
  4. 我不确定你在问什么。如果你问的是像using namespace std;这样的使用指令,那么通常(虽然肯定普遍)不喜欢。像using std::vector;这样的使用声明通常被认为不那么成问题。