现在的位置: 首页 > 综合 > 正文

#include与直接写class加类名有何区别

2013年04月29日 ⁄ 综合 ⁄ 共 1746字 ⁄ 字号 评论关闭

在写 头文件的时间 经常会

有一些 class QFile 等这类 看似 是声明的东西..例如下面

#ifndef WINDOW_H

#define WINDOW_H

QT_BEGIN_NAMESPACE

class QTcpServer;

class QTcpSocket;

class QProgressBar;

class QLabel;

class QDialogButtonBox;

class QFile;

QT_END_NAMESPACE

//code end

class QAction;

class QCheckBox;

...

如果没有 声明 将会 出现类似下面的错误

ISO C++ forbids declaration of 'QFile' with no type

那么 这个是做什么用的呢???? 

是因为在头文件里面只有这些类的指针申明,并没有真正实例化,在这个头文件对应的cpp文件里面应该会

#include < QDialogButtonBox >

#include < QFile >

... 

在cpp文件里面才会正真实例化这些类。

其 实直接在头文件里面#include < QDialogButtonBox> #include< QFile>也是可以的,像它这样做,好像是可以降低各个文件编译时的关联度,不会在改动了一下部分类的时候,引发其他大量文件的重新编译,在做小工程的时候没什么区别,但是做大了,编译一次需要好几个小时的时候,这样做的优势就显现出来了

class   类名只是声明存在这么一个类,但是通过这个声明无法得到任何关于此类的具体信息。这样你可以在其他使用到的地方声明一个该类型的指针。 

include头文件则是将整个该头文件与使用到的地方关联起来。 


使用class   类名一般是为了去除编译依赖,减少编译消耗的时

详细一点的说,假设B的定义是在B.h中,而存在下面这个文件:

// A.h
--------------------------------------------
class A
{
private:
B * impl_;
};
--------------------------------------------

// A.cpp
--------------------------------------------
#include <A.h>
// 其他具体实现
--------------------------------------------
那么直接编译的话,由于编译器不知道B的存在,就会报编译错误。为了解决这个问题,可以在A.h中include B.h,如下:

// A.h
--------------------------------------------
#include <B.h>

class A
{
private:
B * impl_;
};
--------------------------------------------
但是这样,一旦B的定义修改,那么A.h也就会重新编译,导致所有用到A.h的文件也需要重新编译,这样就造成了编译依赖,增加了编译的时间,在大型项目中,如果很多这样的地方的话,甚至可能极度增加编译时间。为了避免这种情况,我们可以这么做

// A.h
--------------------------------------------
class B;

class A
{
private:
B * impl_;
};
--------------------------------------------

// A.cpp
--------------------------------------------
#include <A.h>
#include <B.h>
// 其他具体实现
--------------------------------------------
通过在A.h中声明class B,在A.cpp中include B.h,这样即使B.h改变,A.h也不会改变,其他使用到A.h的文件也就不需要重新编译了,这样就可以避免编译依赖。

#include "xx.h" 在编译的时候把xx.h文件直接展开,所以里面的接口都能用,可以申明对象。但是class xx;这种方式就不会,你只能使用它的指针或者引用,你不能创建申明对象。

抱歉!评论已关闭.