友元声明和友元定义的相互依赖

当将一个类A的成员函数A::F设置成类B的友元时,需要预先定义类A,否则不能将A::F指定为友元。而在定义B之后,才能定义A::F,因为A::F被设为 友元正是为了访问类B的成员函数。所以,可以按照如下的顺序:

  • 声明类B
  • 定义类A,声明但不实现A::F
  • 定义类B,设置A::F为友元
  • 实现A::F

下面是一个例子:

#include <iostream>
#include<cstdlib>
using namespace std;

class Screen;//前向声明
class Window_Mgr
{
public:
  void reloacate(Screen& s);
};

class Screen
{
  friend void Window_Mgr::reloacate(Screen& s);//必须先定义Window_Mgr,才能将Window_Mgr::relocate设为友元
public:
  Screen(int _x, int _y): x(_x), y(_y){};
  void print()
  {
      cout <<"x: " <<x <<",y: "<<y <<endl;
  }
private:
  int x;
  int y;
};

void Window_Mgr::reloacate(Screen& s)
{
  s.x++;
  s.y++;
}

int main(int argc, char* argv[])
{
  Screen s(0, 0);
  Window_Mgr mgr;
  mgr.reloacate(s);
  s.print();
  system("pause");
  return 0;
}

运行结果如下:

友元声明和友元定义的相互依赖,布布扣,bubuko.com

时间: 2025-01-02 11:23:47

友元声明和友元定义的相互依赖的相关文章

友元(友元函数、友元类和友元成员函数) C++

有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员. 友元(frend)机制允许一个类将对其非公有成员的访问权授予指定的函数或者类,友元的声明以friend开始,它只能出现在类定义的内部,友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受其声明出现部分的访问控制影响.通常,将友元声明成组地放在类定义的开始或结尾是个好主意. 1.友元函数 友元函数是指某些

C++之友元机制(友元函数和友元类)

一.为什么引入友元机制? 总的来说就是为了让非成员函数即普通函数或其他类可以访问类的私有成员,这确实破坏了类的封装性和数据的隐蔽性,但为什么要这么做呢? (c++ primer:尽管友元被授予从外部访问类的私有部分的权限,但它并不与面向对象的编程思想相悖,相反,他们提高了公有接口的灵活性).要理解这句话,就必须知道友元形成的过程:(任何函数,或者成员函数或者类想成为某个类的友元,这是由这个类来决定的,而不能从外部强加友情) 我们已知道类具有封装和信息隐藏的特性.只有类的成员函数才能访问类的私有成

关于声明、定义、前向声明、include、循环依赖、普通友元函数、友元类、友元成员函数的总结

做<C++ Primer>(第5版)253页练习题7.3.4有感,故总结之 1 声明 1.1 变量和函数的声明 常见的声明是声明一个变量或函数,一般在头文件.h中声明,例如: pos cursor = 0; // 给定初始值 char get(pos r, pos col) const; 1.2 类的声明 对于一个类,一般是直接在头文件中直接写 class ClassName { ... },这称之为类的定义,然后在类体{...}中又声明或定义了成员变量和成员函数.类的声明是没有类体,只有个类

友元函数和友元类声明举例

注: 友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend.友元不是成员函数,但是它可以访问类中的私有成员.所以,友元声明只能出现在类定义中.因为友元不是授权类的成员,所以它不受其所在类的声明区域public private 和protected 的影响.即友元函数的声明可以出现在类的任何地方 class A { friend class A_friend_class; friend void A_friend_func

【C++基础 05】友元函数和友元类

友元是一种定义在类外部的普通函数或类,但它需要在类体内进行说明,为了与该类的成员函数加以区别,在说明时前面加以关键字friend. 友元不是成员函数,但是它可以访问类中的私有成员. 友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员. 有两种形式的友元: (1)友元函数:普通函数对一个访问某个类中的私有或保护成员. (2)友元类:类A中的成员函数访问类B中的私有或保护成员. 友元函数: 在类声明的任何区域中声明,而定义则在类的外部. frien

C++:友元(非成员友元函数、成员友元函数、友元类)

3.8  友元:友元函数和友元类 友元函数 :既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数,统称为友元函数.友元函数不是当前类的成员函数,而是独立于类的外部函数,但它可以访问该类所有的成员,包括私有成员.保护成员和公有成员.在类中声明友元函数时,需在其函数名前加上关键字friend,此声明可以放在公有部分.也可以放在保护和私有部分.友元函数可以定义在类部,也可以定义在类的外部. 3.8.1 将非成员函数声明为友元函数 //1.将非成员函数声明为友元函数 // 例3.33 友元函数

c++ 友元类 与 友元类派生类

定义: 当一个类B成为了另外一个类A的"朋友"时,那么类A的私有和保护的数据成员就可以被类B访问.我们就把类B叫做类A的友元. 用法: 在A类中加入: friend class B; 下面这个程序说明了友元类与友元派生类的权限. class A { public: friend class FriendA; private: int a; }; class FriendA { public: void print(A& ca) { //因为是友元类,所以可以访问A类的私有成员.

c++友元函数与友元类

1. 友元函数和友元类的需要: 类具有封装和信息隐藏的特性. 只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的. 非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这又破坏了隐藏的特性. 另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,由于参数传递,类型检查和安全性检查等都需要时间开销,而影响程序的运行效率. 2. 为了解决上述问题,提出一种使用友元的方案. 友元是一种定义在类外部的普通函数,但它需要在类体内进行说明,为了与该类的成员函数

[C/C++] 友元函数和友元类

A---友元函数: class Data{ public: ... friend int f(int &m);//友元函数 ... } 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend,其格式如下: friend 类型 函数名(形式参数); 1.友元函数的声明可以放在类的私有部分,也可以放在公有部分,它们是没有区别的,都说明是该类的一个友元函数. 2.一个函数可以是多个类的友元函数