c++ 前向声明

一、使用场景

    假设有两个类A和B,类A要将类B的对象(或者指针)作为自己的成员使用,并且类B将类A的对象(或者指针)作为自己可以访问的数据,那么这个时候要在a.h中include b.h,同时在b.h 中要include a.h,但是相互包含是不可以的,这个时候就要用到类的前向声明了。

    类的前向声明是利用了编译器的特性,编译器在编译的过程中只需要知道各个元素的名称和相应的大小就可以。而在c++中每一个类的大小是固定的,这个时候使用前向声明的类就可以通过编译器。

    比如class foo;

    声明一个foo类,这个声明,有时候也叫做前向声明(forward declaration),在声明完这个foo类之后,定义完这个foo类之前的时期,foo类是一个不完全的类型(incomplete type),也就是说foo类是一个类型,但是这个类型的一些性质(比如包含哪些成员,具有哪些方法)都不知道。所以不能通过这个前向声明的类的指针或者对象去操作自己的成员。

二、使用方法

    假设B类中已经包含了a.h,那么在A类中不能再包含b.h,要在A类中前向声明类B,如下       

//A.h
# include "B.h"
class A
     {
            A(void);
            ~A(void);     
            B b_;  //要包含B.h
        };

  
  //B.h

        class A;
        class B
        {
            B(void);
            ~B(void);
            void fun(A& a)//只能是指针或引用
            {
            }
            //前向声明的类不能实例化对象
            A* a_;  //
        };

三、注意问题

    1. 前向声明的类不能定义对象。

    2. 可以用于定义指向这个类型的指针和引用。

    2. 用于申明使用该类型作为形参或返回类型的函数。
 

全部评论

相关推荐

小鸡蛋吃布丁:上岸编制,考个偏远的四五线小县城的话那确实难度不高,工资三四千的,但是考发达地区的纯看实力和运气了
点赞 评论 收藏
分享
06-15 02:05
已编辑
南昌航空大学 数据分析师
Eason三木:你如果想干技术岗,那几个发公众号合唱比赛的经历就去掉,优秀团员去掉,求职没用。然后CET4这种不是奖项,是技能,放到下面的专业技能里或者单独列一个英语能力。 另外好好改改你的排版,首行缩进完全没有必要,行间距好好调调,别让字和标题背景黏在一起,你下面说能做高质量PPT你得展现出来啊,你这简历排版我用PPT做的都能比你做的好。 然后自我评价,你如果要干数据工程师,抗压能力强最起码得有吧。
点赞 评论 收藏
分享
06-04 09:27
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务