c++ - 通过好友成员功能访问受保护的数据成员
问题描述
编辑:
原始程序有多个文件,如下所示
我正在尝试从不同类的朋友成员函数访问我类中受保护的数据成员。
我不断收到访问错误:
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);
}
解决方案
这个问题只是表面上与friend
. 而是由于类定义和成员函数的循环依赖关系;a
需要知道 的定义,b
因为它指的是b::f
。但是定义b::f
需要定义a
,正如它所指的那样a::i
。幸运的是,类及其成员函数的定义可以相互分离。
您可以采取以下措施逐步解决此问题:
- 宣布
class a;
- define
class b { /* ... */ };
,但没有定义它的成员函数(因为它们需要访问a
's 的定义 - define
class a { /* ... */ };
,可能带有内联成员函数定义 - 最后定义
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;
}
推荐阅读
- angular - FormArray 的垂直自定义验证器
- bash - Postgres Docker psql 错误:角色“postgres”不存在
- git - 如何在 CircleCI 的 config.yml 文件中签出特定分支而不是当前分支
- apache-kafka - Kafka JDBC源连接器 - 来自不同源字段类型的复合键字段?
- powershell - Connect-MsolService 空白屏幕
- javascript - 从视图接收值到控制器
- django - 在 Django REST 中使用 API,服务器端,并在 Angular 中为客户端提供服务
- jenkins - 尽管步骤失败,Jenkinsfile 阶段没有失败
- ios - 如何在 iOS 中解码 AES-128 数据
- c - 从包含 int 和 char 的输入字符串中提取单个 char 和单个 int?