首页 > 解决方案 > 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 的构造函数。

标签: c++friend

解决方案


您已经进行了设置,因此A需要在之前定义类B(因此B可以声明Aas a的成员friend)但同时B需要在之前定义A(因此可以使用的构造函数初始化vecof 的成员)。AB

这是一个循环依赖(A必须在定义之前定义B必须在定义之前A- 无限)。

friend除非先前已定义该类,否则不可能将类的成员声明为 a 。

你需要打破这种循环依赖——要么不具有A::clear()as a friendB要么不初始化类定义中的vec成员(这意味着你只需要在 的构造函数中初始化)。AvecA

或者,可以在没有预先定义的情况下声明Aas friendof (即,预先声明 of就足够了,无需将其定义为)。因此,一种替代方法可能是声明为 a of而不是 only 。BAAAfriendBA::clear()

这意味着B必须在之前定义AB可以在没有 的定义可见性的情况下进行定义A


推荐阅读