在B类的成员函数中调用A类的私有成员。
- 方法1:将B类声明为A类的友元。
- 方法2:将B类中该成员函数声明为A类的友元。
在使用方法二时,出现了一些意外的错误,正确实现顺序应该如下:
//---------(1)--------------
class A; //先声明
//---------(2)--------------
class B //实现和声明可分开也可不分
{
public:
B(); //声明在内
void fun(); //成员函数声明在内
private:
A* a;
};
//---------(3)--------------
class A //在B类后实现
{
friend void B::fun();//友元
public:
A();
private:
int data;
};
AA::AA() { data = 0;} //该行与(4)无顺序要求
//---------(4)--------------
B::B() { a = new AA; } //用到了B类中成员,需要在B类实现后实现
void B::fun() //成员函数实现在外
{
cout << a->data << endl;
}
int main()
{
B b;
b.fun();
return 0;
}
存在的错误类型:
- B类的成员函数实现写在A类实现前,即(4)在(3)前——使用了未定义类型"A"。
- 没有写(1)——未声明的标识符a
- 将(3)放到(1)处——未能实现友元