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