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

之前在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的具体内容了,所以这种写法是正确的。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值