C++ C++;包含标题问题

C++ C++;包含标题问题,c++,C++,我是c/c++新手,我对以下几点感到困惑: 我是否应该将类声明放在它自己的头文件中,而将实际实现放在另一个文件中 我应该在example.h文件还是example.cpp文件中放置类似的标题 如果所有类都需要使用,并且我将一个类的头文件包含到另一个类的头文件中,这是否意味着我包含了两次 如果我使用了很多STL类,那么使用std::的好做法是什么 通常,您会将类声明(包括成员声明)放入头文件中,并将成员函数(方法)的定义放入源文件中。标题的名称通常类似于*.h或*.hpp。至于第3点,你应该把in

我是c/c++新手,我对以下几点感到困惑:

  • 我是否应该将类声明放在它自己的头文件中,而将实际实现放在另一个文件中
  • 我应该在example.h文件还是example.cpp文件中放置类似
    的标题
  • 如果所有类都需要使用
    ,并且我将一个类的头文件包含到另一个类的头文件中,这是否意味着我包含了两次
  • 如果我使用了很多STL类,那么使用
    std::
    的好做法是什么

  • 通常,您会将类声明(包括成员声明)放入头文件中,并将成员函数(方法)的定义放入源文件中。标题的名称通常类似于
    *.h
    *.hpp
    。至于第3点,你应该把includeguard放进你的头文件中,这样它们就可以在同一个源文件中安全地包含多次;然后你可以把它们放在任何你需要的地方。我不明白第5点:您是否询问何时使用
    std:
    名称空间限定?

    对于“包含两次”问题,您的头文件有一个常见模式:

    // _BLAHCLASS_H_ should be different for each header, otherwise things will Go Bad.
    #ifndef _BLAHCLASS_H_
    #define _BLAHCLASS_H_
    
    ... rest of header ...
    
    #endif
    
  • 一般来说,是的。它有助于组织。然而,对于小项目来说,这可能没什么大不了的

  • 我很难理解这里的问题。如果您询问将
    #include
    指令放在何处,则实现文件应包含头文件

  • 是的,但是使用的是防止多个夹杂物

  • 只要它们不是模板,通常是的。模板(无论好坏)必须放在标题中
  • 我更喜欢将我的每个标题设置为“独立”,因此,如果需要任何其他标题才能正常工作,它将包括该标题本身(例如,如果我有一个使用
    std::string
    的类,则该类的标题将
    #include
  • 不可以。除了一些特殊的例外情况,需要编写标准标题,这样您可以在不改变任何内容的情况下多次包含它们(主要的例外情况是
    assert.h
    /
    cassert
    ,包含多次是有意义的)
  • 我不确定你到底在问什么。如果你问的是像
    using namespace std;
    这样的using指令,那么它通常(尽管肯定不是普遍)不受欢迎。像
    using std::vector;
    这样的using声明通常被认为问题较少
  • 1.我是否应该将类声明放在它自己的头文件中, 以及在另一个国家的实际执行情况 档案

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

    2.我是否应该像example.h文件或example.cpp文件那样放置标题 档案

    这取决于您是在example.h文件中需要这些头,还是只在.cpp文件中需要这些头

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

    如果不使用以下宏包装类定义,则会发生这种情况:

    #ifndef FOO_HPP
    #define FOO_HPP
    class { 
    ...
    };
    #endif
    
    5.如果我使用了很多STL类,那么使用std的好方法是什么

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

    但最重要的是,问题4到底在哪里

  • 您通常应该这样做,但对于相对较小的项目,您可能会尽可能避免使用实现文件
  • 如果您的标题仅使用
    中的不完整类型,您可以避免包含它,但您需要这些类型(请参阅)。然而,为简单起见,如果类型使用模板,我通常会包含相应的标题
  • 否。保证一个标题在同一时间内只包含一次
  • 一个常见的好做法是不要将
    使用名称空间std
    放在头文件中

  • #4的不同程度足以引起它自己的问题这些都是不错的问题,但将所有问题合并为一个问题“过于宽泛”。以两个下划线开头的名称是为编译器实现保留的;您应该为包含保护使用不同的模式(例如,
    BLAHCLASS_H_include
    ).同意一般观点,但使用双下划线的人有什么用(我到处都能看到)。这些名称不是为实现保留的吗?(它们看起来也很难看)有很多方法可以将模板的实现与其声明分开,但这可能超出了这个问题的范围。删除
    FOO_HPP
    之前的双下划线,我将对此进行投票