友元函数问题
friend function issues
我在C++中使用友元函数时遇到了一些困难,但我怀疑这更像是我在预处理器指令和 #include 方面遇到的问题的症状。
这是我正在做的事情的一个愚蠢的例子。五个文件:bobby.h、bobby.cpp、billy.h、billy.cpp 和 main.cpp。Billy有一个名为ReceiveMoney的受保护函数。Bobby有一个名为bank的函数,它调用Billy's ReceiveMoney。也就是说,每次鲍比去银行时,他都会和比利一起分钱。
比利·
#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;
}
鲍比·
#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":不是类或命名空间名称或错误 C2653:"Billy":不是类或命名空间名称
我在VS0中的一个空控制台项目中执行此操作
您有一个头文件的循环依赖关系。
billy.h
包括bobby.h
,而bobby.h
包括billy.h
。
显然,由于这种循环依赖关系,编译器无法辨认出类型。
最好的解决方案是重新考虑您的设计并避免循环依赖或
使用前向声明中断循环依赖关系。
只需在bobby.h
中向前声明类Billy
//#include "billy.h" <----- You don't need this include
class Billy; <----- Just Forward Declaration should suffice
您可以在此处使用前向声明,因为声明接受/返回不完整类型的函数或方法,在本例中Billy
是编译器的不完整类型。
你的 #include 有一个循环,你不能那样做。您必须在 billy.h 中使用 Bobby 的前向声明。比如class Bobby;
.即使这样,你也无法声明 friend 函数。
唯一真正的解决方案是 避免对friend
的需求 . 事实上,ReceiveMoney
应该是公开的:如果Bobby代表一个帐户之类的东西,这是合乎逻辑的。
对friend
的约束使得它只对解决类的内部行为有用(例如,集合和实现它们的节点)。
由于循环依赖关系,没有一个类是完全定义的。 因此存在大量错误。如果可能,请更改您的设计并继承或仅包含必要的内容。正如Als所提到的,前瞻声明可能是一种选择。循环依赖关系主要是由于设计错误引起的。
- Visual Studio中的函数声明和函数定义问题
- C++quit()函数中可能存在作用域问题
- 类似于strcat()的函数出现问题
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 类C++中的函数问题(LNK2019和LNK1120错误)
- c++binary_search函数排序数组(流行名称搜索)出现问题
- 关于简单C++函数(is_palindrome)的逻辑的问题
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- constexpr构造函数需要常量成员函数时出现问题
- 添加存储在向量中的大整数的函数出现问题
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 关于 c++ 函数中指针赋值的简单问题
- 如何在标头中声明(或定义)函数的问题
- 有关 c++ 构造函数的问题
- 模板类转换问题 - 无法推断调用的函数
- 从 C++ 中的函数返回数组地址问题
- 关于复制构造函数的一个棘手问题
- 移动赋值运算符;尝试引用已删除的函数.我该如何解决这个问题?
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题