前向声明、头文件和内联

Forward Declaration, Headers and inlining

本文关键字:文件 声明      更新时间:2023-10-16

我读到,在可能的情况下,最好声明一个类,而不是(在头文件中)包含它。

例如:

Class A;
Class B
{
public:
    B();
    ~B();
    A*   GetMyVariable();
    void SetMyVariable(A* newVal);
private:
    A* m_myVariable;
}

它可以很好地编译,并且可以在后续的。cpp文件中的类定义中使用。

然而,假设您现在希望使get和set函数内联(或至少向编译器建议它们是),那么代码将需要更改如下:
//Class A;
#include "A.h"
Class B
{
public:
    B();
    ~B();
    inline A*   GetMyVariable()          { return m_myVariable; }
    inline void SetMyVariable(A* newVal) { m_myVariable = newVal; }
private:
    A* m_myVariable;
}

所以问题是,一种方法比另一种方法好吗?为什么?我会更好地尝试通过从我的一些类中删除内联函数来尽可能多地使用类声明,还是我应该继续尝试在任何地方内联我可以?

真正的答案是,这将取决于您的项目和您的风格,因为两种方法都有优点。前向声明避免了复杂的包含关系,通常更容易让类之间相互使用,而包含可以通过将实现放在头文件中来节省代码和时间。另一个需要考虑的问题是,将模板化类的实现放在头文件中通常更容易/更需要,因此这里通常需要include。

我的建议是,如果可能的话,选择一个策略并坚持下去。我个人使用"总是包含,除非类需要相互使用并且包含创建循环"。然后,当我看到forward声明时,我就知道这两个类之间的关系。

"更好"这个词取决于你的编译器和你所遵循的风格准则。

类中的代码可以由编译器内联。也就是说,编译器可能会粘贴方法的内容,而不是生成方法并调用该方法。

内联由编译器决定。它可以内联,它可以创建一个函数,它可以优化而不是创建函数。

所以,现在决定权在作者手中。作者可能必须遵循一些编码准则来消除内联代码。有些作者更喜欢内联小方法内容。其他人可能更喜欢将所有内容放在源文件中,以防止由于头文件更改而导致构建过程大量重新编译。

做你想做的事:

  1. 帮助您开发健壮和正确的代码。
  2. 使维护更容易。