c++ - C++ 成员函数作为朋友
问题描述
我有 2 个类,即 A 和 B,具有以下独立声明
class A {
private:
std::vector<B> vec = {B("X","Y")};
public:
A();
void clear(std::vector<B>::size_type index);
};
class B {
private:
std::string m_first;
std::string m_second;
public:
B() = default;
B(std::string first, std::string second) : m_first(first), m_second(second) {}
// I want the friend below - how to do it?
friend void A::clear(std::vector<B>::size_type index);
};
我想宣布void A::clear(std::vector<B>::size_type index)
成为 B 类的朋友。在 C++ 中可以吗?我不能为 A 做 B 的前向声明,因为 A 需要使用 2 个参数查看 B 的构造函数。
解决方案
您已经进行了设置,因此A
需要在之前定义类B
(因此B
可以声明A
as a的成员friend
)但同时B
需要在之前定义A
(因此可以使用的构造函数初始化vec
of 的成员)。A
B
这是一个循环依赖(A
必须在定义之前定义B
必须在定义之前A
- 无限)。
friend
除非先前已定义该类,否则不可能将类的成员声明为 a 。
你需要打破这种循环依赖——要么不具有A::clear()
as a friend
,B
要么不初始化类定义中的vec
成员(这意味着你只需要在 的构造函数中初始化)。A
vec
A
或者,可以在没有预先定义的情况下声明A
as friend
of (即,预先声明 of就足够了,无需将其定义为)。因此,一种替代方法可能是声明为 a of而不是 only 。B
A
A
A
friend
B
A::clear()
这意味着B
必须在之前定义A
。 B
可以在没有 的定义可见性的情况下进行定义A
。
推荐阅读
- python - 合并的分布式 keras / tensorflow 最终模型保存在哪里?
- python - 无法在 Google Cloud 网络应用上查看 django 错误页面
- c++ - Ifstream.get 只读取第一行
- c - 为什么 c 在 int 开始时对 0 做出反应
- spring-boot - 通过 docker 容器拒绝访问本地数据库
- stata - 同时生成和排序变量
- node.js - NodeJs api容器在kubernetes中崩溃
- c# - 我的代码有什么问题(SendPingAsync)
- c++ - 从内部类访问外部类而不显式传递实例
- mysql - 如何在 nodejs-mysql 插入查询中获取插入的行数据?