lia*_*iaK 13 c++ header-files forward-declaration
在我的C++项目中何时必须使用#include "myclass.h"头文件的includes()?我什么时候必须使用class(class CMyClass;)的前向声明?
Cha*_*tie 21
通常首先尝试前进声明.这将减少编译时间等.如果不编译则去#include.如果您需要执行以下任何操作,则必须转到#include:
new/ delete,复制等(来自@Mooing Duck的6,7,8,9)
他们可能更多,但我今天没有得到我的语言法律帽子.
小智 11
转发声明有几个问题:
其他人难以维持前瞻性声明.例如,如果头文件包含:
include "MyProject/MyWidgets/MyFooWidgets/FooUtil/Foo.h"
Run Code Online (Sandbox Code Playgroud)
而不是前瞻性声明
class Foo ;
Run Code Online (Sandbox Code Playgroud)
其他人很容易找到Foo类声明的位置.有了前瞻性声明,它并不那么明显; 当用户尝试打开变量声明时,某些IDE(如Eclipse)可能会打开前向声明.
"Could not find file MyProject/MyWidgets/MyFooWidgets/FooUtil/Foo.h"从那时起您将知道在哪里查找相应的错误Foo.cpp并识别包含它的库.如果您认为您的构建花费的时间太长,那么尝试仅在没有链接的情况下进行编译.如果您的代码编译需要10秒钟,链接需要10分钟,则问题与一些额外的包含无关.同样,如果您的头文件包含很多内容,实际上它会导致性能问题,那么您可能需要时间将该文件的内容重构为多个较小的头文件.
所以什么时候可以转发申报?如果您在与真实声明相同的头文件中执行此操作.
例:
class Foo ;
typedef Foo* FooPtr ;
typedef Foo& FooRef ;
class Foo
{
public:
Foo( ) ;
~Foo( ) ;
}
Run Code Online (Sandbox Code Playgroud)
要么
class TreeNode ;
class Tree
{
private:
TreeNode m_root ;
}
class TreeNode
{
void* m_data ;
} ;
Run Code Online (Sandbox Code Playgroud)
小智 5
作为初学者,当您需要使用它们包含的类型或函数时,您应该始终 #include 头文件 - 不要尝试通过前向声明来“优化”您的构建 - 这几乎没有必要,即使在大型项目中,只要项目架构良好。
唯一绝对需要前向声明的情况是在以下情况下:
struct A {
void f( B b );
};
struct B {
void f( A a );
};
Run Code Online (Sandbox Code Playgroud)
其中每个结构(或类)引用另一个结构(或类)的类型。在这种情况下,您需要 B 的前向声明来解决问题:
struct B; // forward declaration
struct A {
void f( B b );
};
struct B {
void f( A a );
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16828 次 |
| 最近记录: |