C++ (友元)(类嵌套时,成员函数以及类声明定义的顺序)小demo
#include<iostream>
using namespace std;
class Building;
//1.因为Goodgay类需要声明Building类变量,
//所以Building类必须Goodgay类之前声明(前向声明);
class GoodGay
{
public:GoodGay();void visit();
private:Building *m_building;
//用指针搁置一下Building类的使用(此时无法使用),等到Building类写好了,
//再用类外成员函数来实例化一个Building类
};
class Building
//2.因为Building的定义中需要将Goodgay类的成员函数声明成友元成员函数,
//所以Building类必须Goodgay类之后定义;
{friend void GoodGay::visit();
public:Building(){m_sitting="客厅";m_bedroom="卧室";}string m_sitting;
private:string m_bedroom;
};
GoodGay::GoodGay()
//3.因为Goodgay中的构造函数需要调用Building的构造函数,
//所以Goodgay类中构造函数的实现必须在Building类的定义之后;
{m_building=new Building;
}
void GoodGay::visit()
{cout<<"visit 函数正在访问:"<<m_building->m_sitting<<endl;cout<<"visit 函数正在访问:"<<m_building->m_bedroom<<endl;
}
void test01()
{GoodGay gg;gg.visit();
}int main()
{test01();
}
#include<iostream>
using namespace std;
class GoodGay
{
public:void visit();
};
class Building
{friend void GoodGay::visit();
public:Building(){m_sitting="客厅";m_bedroom="卧室";}string m_sitting;
private:string m_bedroom;
};
Building B;//如果不在这里实例化Building,下面的B.XXX就会报错
void GoodGay::visit()
{cout<<"visit 函数正在访问:"<<B.m_sitting<<endl;cout<<"visit 函数正在访问:"<<B.m_bedroom<<endl;
}
void test01()
{GoodGay gg;//Building B;gg.visit();
}
int main()
{//Building B;test01();
}
编译只会从上到下遍历代码,不会像人一样跳读代码来找所需要的关键信息,出现一个新东西时要让编译器知道是什么。