C++ 友元

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:

    令成员函数为友元,需要注意顺序,要仔细组织程序的结构,以满足声明和定义的彼此以来关系:

    1. 首先定义B类,其中声明funb2函数,但是不定义它
    2. 定义A类,其中包含对B::funb2的友元声明
    3. 定义funb2方法,此时funb2才能呢个调用A的私有成员
  • NOTE:
    编译指令为:g++ –std=c++11 -g TestFriend_2.cpp Friend_2.cpp -o TestFriend_2
    但是,不能呢个将B::funb2的实现放在Freind.h中,否则编译会报错(“多次定义”),具体原因没弄明白

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值