我在使用 C++ 中的友元函数时遇到一些困难,但我怀疑这更多是预处理器指令和 #include 出现问题的征兆。
这是我所做的一个愚蠢的例子。五个文件:bobby.h、bobby.cpp、billy.h、billy.cpp 和 main.cpp。 Billy 有一个名为 ReceiveMoney 的 protected 函数。 Bobby 有一个名为 bank 的函数,它调用 Billy 的 ReceiveMoney。也就是说,每次 Bobby 去银行,他都会和 Billy 分钱。
比利.h
#ifndef BILLY_H
#define BILLY_H
#include "bobby.h"
class Billy
{
friend void Bobby::Bank(int, Billy &);
public:
Billy();
protected:
void ReceiveMoney(int inc);
private:
int money;
};
#endif
比利.cpp
#include "billy.h"
Billy::Billy()
{
money = 0;
}
void Billy::ReceiveMoney(int inc)
{
money+=inc;
}
鲍比.h
#ifndef BOBBY_H
#define BOBBY_H
#include "billy.h"
class Bobby
{
public:
Bobby();
void Bank(int amount, Billy & b);
protected:
int money;
};
#endif
鲍比.cpp
#include "bobby.h"
Bobby::Bobby()
{
money = 0;
}
void Bobby::Bank(int amount, Billy & b)
{
b.ReceiveMoney(amount/2);
}
主要.cpp
#include "billy.h"
#include "bobby.h"
int main()
{
Bobby bo;
Billy bi;
bo.Bank(150, bi);
return 0;
}
我通常会收到大量错误 错误 C2653:“Bobby”:不是类或命名空间名称 或者 error C2653: 'Billy' : 不是类或命名空间名称
我在 VS0 中的一个空控制台项目中执行此操作
最佳答案
你有头文件的循环依赖。
billy.h
包含bobby.h
,而bobby.h
包含billy.h
。
显然,由于这种循环依赖,编译器无法确定类型。
最好的解决方案是重新考虑您的设计并避免循环依赖或
使用 Forward declarations 打破循环依赖。
只需在 bobby.h
中转发声明类 Billy
//#include "billy.h" <----- You don't need this include
class Billy; <----- Just Forward Declaration should suffice
您可以在此处使用前向声明,因为声明接受/返回不完整类型的函数或方法,在这种情况下 Billy
是编译器的不完整类型。
关于c++ - 好友功能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10598527/