请给个例子,看c++ primer第4版和网上的一些例子,c++ 中用类的成员函数做友元都是把两个类的定义和实现写在同一个文件中的。如果想分开应该怎么写?
假设类A有一个友元函数是类B的成员函数,A和B两个类的定义和实现要分开。A类用A.h定义,用A.cpp实现。B类用b.h定义,用B.cpp实现。 这种方式是不是有什么缺陷所以不这样实现?
如果类A和类B的定义和实现要分开,可以按照以下步骤来实现类A中使用类B的成员函数作为友元函数:
1、在类B的头文件b.h中声明类B,并声明友元函数的原型,不需要包含类A的头文件a.h,如下:
// b.h
#ifndef B_H
#define B_H
class B {
public:
void somePublicFunction();
private:
friend void A::someFriendFunction(B& b);
};
#endif // B_H
2、在类A的头文件a.h中声明类A和友元函数的原型,需要包含类B的头文件b.h,如下:
// a.h
#ifndef A_H
#define A_H
#include "b.h"
class A {
public:
void somePublicFunction();
friend void someFriendFunction(B& b);
private:
int data;
};
#endif // A_H
3、在类B的源文件b.cpp中实现类B的成员函数和友元函数,如下:
// b.cpp
#include "b.h"
#include "a.h"
void B::somePublicFunction() {
// ...
}
void someFriendFunction(B& b) {
// ...
}
4、在类A的源文件a.cpp中实现类A的成员函数,如下:
// a.cpp
#include "a.h"
void A::somePublicFunction() {
// ...
}
这种方式实现类A中使用类B的成员函数作为友元函数是可行的,但是要注意的是,由于类B的成员函数和友元函数需要访问类A的私有成员,因此需要在类A中将这些函数声明为友元函数。这样就需要在类B的头文件中引用类A的头文件,而在类A的头文件中又需要引用类B的头文件,可能会导致循环引用的问题。因此,这种方式需要在头文件中使用前置声明来解决循环引用问题。
不知道你这个问题是否已经解决, 如果还没有解决的话: