gpt4 book ai didi

c++ - C++ 中的双边友元函数 : how to make it compile?

转载 作者:行者123 更新时间:2023-12-02 22:53:51 24 4
gpt4 key购买 nike

我有以下 C++ 文件:

啊啊


#ifndef A_H
#define A_H

#include "B.h"

class A
{
private:
int m_a;
public:
A();

void a(const B &b);

friend void B::b(const A &a);
};

#endif // A_H

A.cpp


#include "A.h"
#include "B.h"
#include

A::A()
{
m_a = 100;
}

void A::a(const B &b)
{
std::cout << b.m_b << ".\n";
}

B.h


#ifndef B_H
#define B_H

class A;

class B
{
private:
int m_b;
public:
B();
void b(const A &a);

friend void A::a(const B &b); // error: invalid use of incomplete type 'class A'
};

#endif // B_H

B.cpp


#include "B.h"
#include
#include "A.h"

B::B()
{
this->m_b = 101;
}

void B::b(const A &a)
{
std::cout << a.m_a << ".\n";
}

当我尝试编译它时,它给了我:

error: invalid use of incomplete type 'class A'.

我应该如何解决这个问题?

最佳答案

不可能将 B 的成员函数设为 A 的友元,并将 A 的成员函数设为 B 的友元。

有多种方法可以克服这个问题。

  1. 将一个或两个函数编写为非成员。如果需要的话,让他们成为两个类(Class)的 friend 。
  2. 让全类同学成为其他类(class)的 friend 。如果这个权限太宽泛,请提取一个较小的类来充当 friend 。
  3. 将两个类都转为类模板(模板参数无关紧要)。

    enum unit {u};

    template <unit X> class A;

    template <unit X> class B
    {
    static void foo() {}
    static void bar() { A<X>::foo(); }
    friend void A<X>::bar();
    };

    template <unit X> class A
    {
    static void foo() {}
    static void bar() { B<X>::foo(); }
    friend void B<X>::bar();
    };

    using AX = A<u>;
    using BX = B<u>;

关于c++ - C++ 中的双边友元函数 : how to make it compile?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60164287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com