C++ Friend 函数位于单独的头文件和.cpp文件中

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

本文关键字:文件 cpp Friend 函数 于单独 C++      更新时间:2023-10-16
//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 的成员。

bool A::compareEntry_sumPct_nonMega(Entry arg1, Entry arg2)

类的友元函数不是其成员函数。因此,A::告诉编译器它应该将此函数视为成员函数,但它显然不是成员函数。

因此,取出A:: IE范围分辨率。

函数不能既是类T的成员函数,又是T的友元函数。如果它已经是一个成员函数,那么,让它成为该类的朋友有什么意义。

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

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;
}

由于您已将"friend bool compareEntry_sumPct_nonMega(Entry arg1, Entry arg2(;"定义为 friend 函数,因此您告诉编译器函数 compareEnty_sumPct_nonMega 是一个非成员函数,应该可以访问类 "A" 的私有方法和变量。但是当你在 A.cpp 中定义函数时,你将其定义为类 "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;
}