单独的头文件和 .cpp 文件中的 C++ 友元函数

C++ Friend Functions in separate header and .cpp files

//A.h
class A{
friend bool compareEntry_sumPct_nonMega(Entry arg1, Entry arg2);
}

//A.cpp
#include "A.h"
bool A::compareEntry_sumPct_nonMega(Entry arg1, Entry arg2)
{
    bool b = arg1.sumOfNonMegaEntryPct(numbers) < arg2.sumOfNonMegaEntryPct(numbers);
    return b;
}

我收到错误 compareEntry_sum_Pct_nonMega 不是 A 的成员。

由于您已将 "friend bool compareEntry_sumPct_nonMega(Entry arg1, Entry arg2);" 定义为友元函数,因此您告诉编译器函数 compareEnty_sumPct_nonMega 是一个非成员函数,它应该可以访问 "friend bool compareEntry_sumPct_nonMega(Entry arg1, Entry arg2);" 的私有方法和变量=23=] "A"。但是当你在 A.cpp 中定义函数时,你将它定义为 class "A" 的成员函数,因为你的定义有 "bool **A::**compareEntry_sumPct_nonMega(Entry arg1, Entry arg2)"。删除 A.cpp 中的 A:: 并尝试编译。

将您的 A.cpp 更改为 -

//A.cpp
#include "A.h"
bool compareEntry_sumPct_nonMega(Entry arg1, Entry arg2)
{
    bool b = arg1.sumOfNonMegaEntryPct(numbers) < arg2.sumOfNonMegaEntryPct(numbers);
    return b;
}
bool A::compareEntry_sumPct_nonMega(Entry arg1, Entry arg2)

class 的友元函数不是它的成员函数。 所以,A:: 告诉编译器它应该把这个函数当作一个成员函数,但它显然不是一个成员函数。

所以,去掉A::即作用域解析

一个函数不能既是classT的成员函数又是T的友元函数。如果它已经是一个成员函数,那么,让它成为那个 class.

的朋友有什么意义呢?

如果您打算将一个 class 函数用作另一个 class 的友元,那么您可以按如下方式使用它:

class B
{
public:
    void fB(A& a); 
    void fB2(A& a); 
};

class A
{
public:
    friend void B::fB(A& a);
    void fA(){}
};
//A.h
class A{
friend bool compareEntry_sumPct_nonMega(A& obj, Entry arg1, Entry arg2); <-- CHANGE done here
}

//A.cpp
#include "A.h"
bool compareEntry_sumPct_nonMega(A& obj, Entry arg1, Entry arg2) <-- CHANGE done here
{
    // Using 'obj', all members (private as well) of class A can be accessed <-- CHANGE done here
    bool b = arg1.sumOfNonMegaEntryPct(numbers) < arg2.sumOfNonMegaEntryPct(numbers);
    return b;
}