首页 > 解决方案 > 通过好友成员功能访问受保护的数据成员

问题描述

编辑:

原始程序有多个文件,如下所示

我正在尝试从不同类的朋友成员函数访问我类中受保护的数据成员。

我不断收到访问错误:

9:32:错误:无效使用不完整类型'class b' 5:7:错误:在成员函数'void b::f(a*)'中前向声明'class b':12:13:错误:' int a::i' 受保护 20:47:错误:在此上下文中

这是我的代码:

// Example program
#include <iostream>
#include <string>

class b;
class a{
    public:
    
    friend void b::f(a* pointer);
    
    protected:
    int i = 6;
    
    
    
};

class b{
    public:
    void f(a* pointer){std::cout<<pointer->a::i<<std::endl;}
    
    
};




int main()
{
  a a1;
  b b1;
  
  b1.f(&a1);
}

标签: c++friend-function

解决方案


这个问题只是表面上与friend. 而是由于类定义和成员函数的循环依赖关系;a需要知道 的定义,b因为它指的是b::f。但是定义b::f需要定义a,正如它所指的那样a::i。幸运的是,类及其成员函数的定义可以相互分离。

您可以采取以下措施逐步解决此问题:

  1. 宣布class a;
  2. define class b { /* ... */ };,但​​有定义它的成员函数(因为它们需要访问a's 的定义
  3. define class a { /* ... */ };,可能带有内联成员函数定义
  4. 最后定义b的成员函数。

这是它的样子:

// Step 1:
class a;

// Step 2:   
class b{
    public:
    void f(a* pointer);
};

// Step 3:
class a{
    public:
    friend void b::f(a* pointer);
    
    protected:
    int i = 6;
};

// Step 4:
void b::f(a* pointer)
{
    std::cout<<pointer->a::i<<std::endl;
}

推荐阅读