Friend.h
#ifndef FRIEND_H_
#define FRIEND_H_
#include <vector>
#include <iostream>
/**
* 令成员函数为友元,需要注意顺序,要仔细组织程序的结构,以满足声明和定义的彼此以来关系:
* 1. 首先定义B类,其中声明funb2函数,但是不定义它
* 2. 定义A类,其中包含对B::funb2的友元声明
* 3. 定义funb2方法,此时funb2才能呢个调用A的私有成员
*
* 编译指令为:g++ --std=c++11 -g TestFriend_2.cpp Friend_2.cpp -o TestFriend_2
* 但是,不能呢个将B::funb2的实现放在Freind.h中,否则编译会报错(“多次引用”),具体原因没弄明白
*
*/
class B {
public:
void funb1();
void funb2();
};
class A {
friend void B::funb2();
public:
A();
A(int, int);
void funa1();
void funa2();
private:
int val1 = 1;
int val2 = 1;
};
#endif
Friend_2.cpp
#include <iostream>
#include <vector>
#include "Friend.h"
A::A() {}
A::A(int x, int y) : val1(x), val2(y) {}
void A::funa1() {
std::cout << "this is funb1" << std::endl;
}
void A::funa2() {
std::cout << val1 << std::endl;
}
void B::funb1() {
std::cout << "this is funb1" << std::endl;
}
void B::funb2() {
std::cout << "want to access A.val1" << std::endl;
std::vector<A> avec{A(34,35), A(99,100)};
//std::vector<A> avec;
std::cout << avec[0].val1 << std::endl;//因为B是A的友元,所以可以访问A的私有数据成员
}
TestFriend_2.cpp
#include "Friend.h"
using namespace std;
int main(int argc, char const *argv[]) {
B b;
b.funb2();
return 0;
}
NOTE:
令成员函数为友元,需要注意顺序,要仔细组织程序的结构,以满足声明和定义的彼此以来关系:
- 首先定义B类,其中声明funb2函数,但是不定义它
- 定义A类,其中包含对B::funb2的友元声明
- 定义funb2方法,此时funb2才能呢个调用A的私有成员
NOTE:
编译指令为:g++ –std=c++11 -g TestFriend_2.cpp Friend_2.cpp -o TestFriend_2
但是,不能呢个将B::funb2的实现放在Freind.h中,否则编译会报错(“多次定义”),具体原因没弄明白