c++ - 朋友功能错误:“B”尚未声明
问题描述
我测试了下面的代码(只是为了测试,我知道这是个坏主意),我不明白为什么它会出错。请帮我!
有两个类A
和B
,都在单独的hpp
文件中。我让它们相互包含(我认为这无关紧要,因为),直到我添加了ininclude guard
的定义才出错。B::fun
B.cpp
啊
#ifndef A_H
#define A_H
#include "B.h"
class A {
friend void B::fun(A&);
};
#endif
溴化氢
#ifndef B_H
#define B_H
#include "A.h"
class A;
class B {
public:
void fun(A&);
};
#endif
B.cpp
#include "B.h"
void B::fun(A& a) {
}
主文件
#include "A.h"
#include "B.h"
int main() {
}
我用这样的命令运行它:
g++ -g -o test main.cpp B.cpp
错误信息
A.h:7:17: error: 'B' has not been declared
friend void B::fun(A&);
我知道症状的两种解决方法,但我想了解问题的根本原因。
方法一:将代码注释#include "A.h"
在B.h
方法二:修改#include "B.h"
为#include "A.h"
inB.cpp
我想知道为什么这些解决方法可以避免症状,这两种方法的确切原因。
解决方案
只需#include "A.hpp"
从B.hpp
. 发生这种情况是因为当B.cpp
includes时B.hpp
,后者又包含A.hpp
beforeB
被定义。但是你根本不需要包含A.hpp
,因为你已经正确地声明了class A
。
推荐阅读
- excel - 如何修复“对象变量或未设置块变量”
- javascript - 如何从保存的 AsyncStorage 中的对象中获取项目?
- excel - 将“直到”与“与,或”结合使用,而不是寻找第二个条件
- laravel - 使用 Vagrant 重新启动虚拟服务器后,Laravel 应用程序无法运行
- html - 复选框需要点击两次才能取消选中?
- javascript - VSCode:在git staging时触发organizeImports
- python - 框架上的画布和使用按钮在框架之间切换
- ios - 我们如何使用`SwiftUI`添加`Button`和`TextField`
- c++ - 在什么情况下我在用私有变量重载类的运算符时使用朋友?
- r - 如何根据因子变量为 xyplot 的每个面板中的背景着色?