实例理解c++中向前声明与引用头文件的区别

使用C++编程,编译时经常出现这种错误"error: invalid use of incomplete type ‘class xxx’",或“error: forward declaration of ‘class xxx’”. 解决这种错误就是用理解c++中向前声明与引用头文件的区别。

  • 使用方式一:
    class B;
    class A{
    public:
    B b;
    };
    class B{
    public:
    A a;
    };
    在上面的写法中,编译就回出现上面的错误。因为对象b无法预知。解决方法如下:
    class B;
    class A{
    public:
    B *b;
    };
    class B{
    public:
    A *a;
    };
    因为指针这一数据类型的大小是特定的,编译器可以获知.

  • 使用方式二:
    class B;
    class A:public B
    {
    };
    class B{
    };
    这种方式也会出现编译错误,解决如下:
    #include “B.h”;
    class A:public B
    {
    };
    file B.h:
    class B{
    };
    类的继承需要使用头文件而不能使用向前声明。

  • 前置声明的使用:
      前置声明只能使用于 指针、引用、函数形参、函数返回值。如果用于类内部的成员变量的声明,类的继承列表、模板的参数都是非法的。
      前置声明,可以节约预处理器的展开时间,也就是在编译的时候速度是增快了,但是伴随着很多坑。

  • 总结
    原则一: 如果可以不包含头文件,那就不要包含,这时候前置声明可以解决问题,如果使用的仅仅是一个类的指针,没有使用这个类的具体对象(非指针),也没有访问到类的具体成员,那么前置声明就可以了,因为指针这一数据类型的大小是特定的,编译器可以获知.
    原则二: 尽量在CPP文件中包含头文件,而非在头文件中假设类A的一个成员是是一个指向类B的指针,在类A的头文件中使用了类B的前置声明并便宜成功,那么在A的实现中我们需要访问B的具体成员,因此需要包含头文件,那么我们应该在类A的实现部分(CPP文件)包含类B的头文件而非声明部分(H文件).

猜你喜欢

转载自blog.csdn.net/marcosun_sw/article/details/84376068