c++ - 好友功能问题

标签 c++ friend preprocessor-directive

我在使用 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/

相关文章:

c++ - 私有(private)析构函数友元函数

c++ - 在哪里指定预处理器指令是合法的?

c - #if 定义的预处理器运算符中的括号是什么意思?

JSHint:不包括预处理器指令。不完全是

c++ - FOR 循环语句中的 IF 语句?

c++ - 如何区分 char 文字和 unsigned int 作为构造函数的参数

scala - 如何从 sbt 0.10.0 项目中获取依赖项 jar 列表

c++ - 如何从 C++ 文件中读取以空格分隔的信息

c++ - Visual Studio 2012的任何免费C/C++重构工具/插件?

c++ - 具有不同模板参数作为输入的模板类的友元函数