关于C++前置声明的补充

来源:互联网 发布:js隐藏控件 编辑:程序博客网 时间:2024/06/15 21:59

之前在namespace中我已经提到过前置声明,当一个类需要用到另一个类并且只是需要指针时,我们可以使用前置声明即可

class A{private:      B *b;};class B{};


这里类A是在类B前面,编译器编译类A时会报错,因为类A中使用类B,虽然只是指针,但是也是提到了类B,而这个很简单,只需要在类A前面声明类B存在即可

class B;class A{private:      B *b;};class B{};

当然这样只是能创建类B的指针,前面也提到过如果类A要使用类B的内容,如果是在同一个文件中就把类B写在类A的前面,如果是工程文件,则类A的头文件class类B,类A的cpp文件include类B的头文件,这都是我上次提到过的,这里就不说了。

这次要补充的是其实在第一种中可以更加具体的,而不是说必须要把类B写在类A的前面,比如我下面的代码

#include<iostream>using namespace std;class B;class A{private:    B *p=NULL;public:    A(B *b);    ~A(){}    void Print();};A::A(B *b){    p=b;}class B{private:    int b;public:    B(int b=0);    ~B(){};    void get();};void A::Print(){    p->get();}B::B(int b){    this->b=b;}void B::get(){    cout<<"类B的某个对象的参数为b的值为"<<b<<endl;}int main(){    int x;    cin>>x;    B b(x);    A a(&b);    a.Print();    return 0;}
很显然可以发现类A中的函数Print()通过类B的对象指针调用了类B的函数,但是类B确实是在类A后面,在类A前面只是有类B的前置声明,仔细点就可以发现类A的Print()函数并不是内联函数或者说是在类B的声明前面,Print()函数在类B的声明之后,根据编译器编译的顺序,在编译类A的Print()函数定义时类B已经声明了,所以已经可以访问类B的具体内容了,所以这种写法是正确的。




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 植过发15天手抓植发区了怎么办 洗头梳头老掉头发怎么办 掉头发特别特别严重怎么办 哺乳期掉头发特别严重怎么办 最近掉头发特别严重怎么办 近掉头发特别严重怎么办 50多岁脱发严重怎么办 2岁宝宝掉发严重怎么办 生孩子后掉头发严重怎么办 有16岁孩孑教吾听怎么办 生完孩子后脱发怎么办 学生掉头发很厉害怎么办 35岁开始掉头发怎么办 高三学生玩手机怎么办 高三学生不学习怎么办 17岁经常掉头发怎么办 出汗后头皮很痒怎么办 头发老是掉怎么办会不会长出来 头发痒还掉头发怎么办 7个月宝宝入睡难怎么办 45天宝宝入睡难怎么办 两岁宝宝入睡难怎么办 吃激素掉发严重怎么办 20多岁掉头发怎么办 最近头发老掉怎么办20 20多岁最近严重脱发怎么办 头痒头皮屑多掉头发怎么办 有头屑头痒掉头发怎么办 老是头痒掉头发怎么办 头屑头痒掉头发怎么办 头痒头屑多掉头发怎么办 洗头发时总是掉发怎么办 染头发染到脸上洗不掉怎么办 总爱掉头发怎么办20岁 头发开叉长的慢怎么办 洗头时掉很多头发怎么办 出门前头发很油怎么办 关于头发头顶头发少怎么办 每天掉100根头发怎么办 小孩嘴巴烂了该怎么办 小孩吃烧烤嘴巴肿好大该怎么办