第一种:将ClassB::getNum()声明为ClassA的友元函数,
并在后续实现中产生ClassA的对象:
//ClassA.h
#ifndef H_ClassA
#define H_ClassA
#include <iostream>
using namespace std;
#include"ClassB.h"
class ClassA
{
public:
ClassA():m_Num(3){ cout << "ClassA:构造函数"<<endl; }
virtual ~ClassA(){ cout << "ClassA:析构函数"<<endl; }
friend int ClassB::getNum();
private:
int getNum(){ cout << "ClassA:" << m_Num<<endl; return m_Num; }
int m_Num;
};
#endif
//ClassB.h
#ifndef H_ClassB
#define H_ClassB
#include<iostream>
using namespace std;
class ClassB
{
public:
ClassB(){ cout << "ClassB:构造函数"<<endl; }
virtual ~ClassB(){ cout << "ClassB:析构函数"<<endl; }
int getNum();
};
#endif
//ClassB.cpp
#include"ClassB.h"
#include"ClassA.h"
int ClassB::getNum()
{
{ ClassA a; return a.getNum(); }
}
//main.cpp
#include<iostream>
using namespace std;
#include "ClassA.h"
#include "ClassB.h"
int main(int argc, char* argv[])
{
ClassB b;
b.getNum();
getchar();
return 0;
}
第二种:将ClassB直接声明为ClassA的友元类,
然后直接在类定义中的getNum函数中产生了ClassA的对象:
//ClassA.h
#ifndef H_ClassA
#define H_ClassA
#include <iostream>
using namespace std;
class ClassA
{
public:
ClassA():m_Num(3){ cout << "ClassA:构造函数"<<endl; }
virtual ~ClassA(){ cout << "ClassA:析构函数"<<endl; }
friend class ClassB;
private:
int getNum(){ cout << "ClassA:" << m_Num<<endl; return m_Num; }
int m_Num;
};
#endif
//ClassB.h
#ifndef H_ClassB
#define H_ClassB
#include<iostream>
using namespace std;
#include "ClassA.h"
class ClassB
{
public:
ClassB(){ cout << "ClassB:构造函数"<<endl; }
virtual ~ClassB(){ cout << "ClassB:析构函数"<<endl; }
int getNum(){ ClassA a; return a.getNum(); };
};
#endif
//main.cpp
#include<iostream>
using namespace std;
#include "ClassA.h"
#include "ClassB.h"
int main(int argc, char* argv[])
{
ClassB b;
b.getNum();
getchar();
return 0;
}
两种情况的运行结果相同: