• C++ 类的前向声明的用法


    我们知道C++的类应当是先定义,然后使用。但在处理相对复杂的问题、考虑类的组合时,很可能遇到俩个类相互引用的情况,这种情况称为循环依赖。

    例如:

    class A
    {
    public:
        void f(B b);//以B类对象b为形参的成员函数
                    //这里编译错位,因为'B'为为止符号
    };
    
    class B
    {
    public:
        void g(A a);
    };

    这里类A的公有成员函数f的形参是类B的对象,同时类B的公有成员函数g也以类A的对象为形参。由于在使用一个类之前,必须首先定义该类,因此无论将哪一个类的定义放在前面,都会引起编译错误。结局这个问题的方法,就是使用前向引用声明。前向引用声明,是在引用未定义的类之前,将该类的名字告诉编译器,试编译器知道那是一个类名。这样,当程序中使用这个类名时,编译器就不会认为是错误,而类的完整定义可以在程序的其他地方。在上述程序加上下面的前向引用声明,问题就解决了。

    class B; //前向引用声明
    class A//A类的定义
    {
    public://外部接口
        void f(B b);//以B类对象b为形参的成员函数
                   
    };
    
    class B//B类的定义
    {
    public://外部接口
        void g(A a);//以A类对象a为形参的成员函数
    };
     
     
    使用前向引用声明虽然可以解决一些问题,但它并不是万能的。需要注意的是,尽管使用了前向引用声明,但是在提供一个完整的类声明之前,不能定义该类的对象,也不能在内联成员函数中使用该类的对象。请看下面的程序段:
    class Fred;    //前向引用声明
    class Barney
    {
        Fred x;    //错误:类Fred的声明尚不完善
    };
    class Fred
    {
        Barney y;
    };

    编译出错的原因是对此类Fred的前向引用声明只能说明Fred是一个类名,而不能给出该类的完整定义,因此在类Barney中不能定义类Fred的数据成员。

    再看下面这一段程序:

    class Fred;    //前向引用声明
    
    class Barney
    {
    public:
        void method()
        {
            x->yabbaDabbaDo();    //错误:Fred类的对象在定义之前被使用
        }
    private:
        Fred* x;   //正确,经过前向引用声明,可以声明Fred类的对象指针
    };
    
    class Fred
    {
    public:
        void yabbaDabbaDo();
    private:
        Barney* y;
    };

    出错原因:类Barney的内联函数中使用了由x所指向、Fred类的对象,而此时Fred类尚未完整地定义。

    应该记住:当你使用前向引用声明时,你只能使用被声明的符号,而不能涉及类的任何细节。

     
    C++的类可以进行前向声明。但是,仅仅进行前向声明而没有定义的类是不完整的,这样的类,只能用于定义指针、引用、以及用于函数形参的指针和引用。
    而不能定义对象(因为此时编译器只知道这是个类,还不知道这个类的大小有多大),也不能访问类的对象,任何形式的访问都不允许(因为此时根本不知道有些什么成员)。等到类正式定义以后,就可以以各种方式使用该类了。
  • 相关阅读:
    Map Wiki -- proposed by Shuo Ren
    Smart Disk -- proposed by Liyuan Liu
    ubuntu 16.04下如何打造 sublime python编程环境
    manjaro linux没有ll等命令的解决办法
    python学习-命名规则
    python-unitetest-unittest 的几种执行方式
    python-pytest学习(一)- 简介和环境准备
    Python+request+unittest学习(一)- 读取文本出现 锘 * 系列乱码错误(UTF-8 BOM问题)的原因及解决方法
    Python+Selenium框架版(十)- unittest执行方法之discover()方法
    Python+Selenium框架版(九)- unittest执行法之makeSuit()
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/10801725.html
Copyright © 2020-2023  润新知