单独的头文件和 .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;
}
//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;
}