// 友元函数

class B;

class A {
public:
A() {
cout << "A()" << endl;
}
~A() {
cout << "~A()" << endl;
}

private:
friend void func(const A& aObj, const B& bObj);
void privateFunction() const {
cout << "A privateFunction()" << endl;
};
};

class B {
public:
B() {
cout << "B()" << endl;
}
~B() {
cout << "~B()" << endl;
}

private:
friend void func(const A& aObj, const B& bObj);
void privateFunction() const {
cout << "B privateFunction()" << endl;
};

};

void func(const A& aObj, const B& bObj) {
aObj.privateFunction();
bObj.privateFunction();
}

int main() {

func(A(), B());

return EXIT_SUCCESS;
}
// 友元类

class B;

class A {
public:
A() {
cout << "A()" << endl;
}
~A() {
cout << "~A()" << endl;
}

private:
friend class B;
void privateFunction() const {
cout << "A privateFunction()" << endl;
};
};

class B {
public:
B() {
cout << "B()" << endl;
}
~B() {
cout << "~B()" << endl;
}

void someFunc(const A& aObj) {
aObj.privateFunction();
}
};

int main() {

B().someFunc(A());

return EXIT_SUCCESS;
}
// 友元成员函数  A.h

#ifndef CLIONTEST_A_H
#define CLIONTEST_A_H

#include <iostream>
using namespace std;

#include "B.h"

class A {
public:
A();
~A();

private:
friend void B::func(const A& aObj);
void privateFunction() const;
};


#endif //CLIONTEST_A_H
// 友元成员函数  A.cpp

#include "A.h"

A::A() {
cout << "A()" << endl;
}

A::~A() {
cout << "~A()" << endl;
}

void A::privateFunction() const {
cout << "A privateFunction()" << endl;
};
// 友元成员函数  B.h

#ifndef CLIONTEST_B_H
#define CLIONTEST_B_H

#include <iostream>
using namespace std;

#include "A.h"

class A;

class B {
public:
B();
~B();

void func(const A& aObj);
};

#endif //CLIONTEST_B_H
// 友元成员函数  B.cpp

#include "A.h"
#include "B.h"

B::B() {
cout << "B()" << endl;
}
B::~B() {
cout << "~B()" << endl;
}

void B::func(const A& aObj) {
aObj.privateFunction();
}
// 友元成员函数

#include "A.h"
#include "B.h"

int main() {

B().func(A());

return EXIT_SUCCESS;
}