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

时间:2015-10-31 05:00:43

标签: c++ function class friend

//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的成员。

3 个答案:

答案 0 :(得分:1)

由于您已经定义了“friend bool compareEntry_sumPct_nonMega(Entry arg1,Entry arg2);”作为友元函数,您告诉编译器函数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;
}

答案 1 :(得分:1)

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

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

所以,取出A::即范围解析。

函数既不能是类T的成员函数,也不能是T的友元函数。如果它已经是一个成员函数,那么,使它成为该类的朋友的重点是什么。

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

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

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

答案 2 :(得分:0)

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