
废话不多说,直接晒出全部代码,也很简洁..
--------------------
#include <iostream> #include "statement.h" int main(int argc, char **argv) { return 0; } #ifndef _STATEMENT_H_ #define _STATEMENT_H_ #include "testA.h" #include "testB.h" #endif // !_STATEMENT_H_ #ifndef _TESTA_H_ #define _TESTA_H_ #include "statement.h" class testA { public: testA(testB b); private: }; #endif // !_TEST_A_ #include "testA.h" testA::testA(testB b) { //pass } testB 类的头文件和 cpp 和 testA 一模一样,这里干脆就不复制粘贴了,简单来说就是啥具体内容都没有..
然后编译不通过,是 VS2017,错误代码都是 C2061,『语法错误:标识符 testB 』出现两次,『语法错误:标识符 testA 』出现一次.
请问这个错误是为何?为什么要阻止这样的行为?应该怎么做?
谢谢
1 benson458 2018 年 12 月 11 日 via iPhone 你在声明 A 的时候用到了 B,声明 B 的时候又用到了 A。 加个前置声明试试。在 testA.h 第三行之后放一行 class testB; |
3 feverzsj 2018 年 12 月 11 日 你这是 java 写多了 |
4 Newyorkcity OP @innoink 那请问有没有什么办法实现这种想法呢?谢谢 |
5 Newyorkcity OP @innoink 噢,参数要求那种类的指针对吧! |
6 innoink 2018 年 12 月 11 日 via Android @Newyorkcity 改成引用或者指针传参数,然后使用前置声明 |
7 innoink 018 年 12 月 11 日 via Android 其实本质上,你这个 testb 的头文件就不可能 include 进来。 main.cpp 中 include 了 statement.h,即定义了_STATEMENT_H_,然后 statement.h 中 include 了 testA.h,testA.h 中又 include 了 statement.h,你是想在这里把 testB.h 包含进来,但是_STATEMENT_H_在 main.cpp 那里已经定义,这个 include 就“失败”了,testB.h 最终不会进来 |
8 exonuclease 2018 年 12 月 11 日 via iPhone 你就拿个引用不就行了 没看懂你要干嘛 |
9 Newyorkcity OP @innoink 这个应该不是问题吧,statement.h 中也 include 了 testB.h,include testA.h 的时候 testA 里不会再 include testB.h 没关系,之后 statement.h 还有一个 include testB.h 要执行,这一步会把 testB include 进来的吧 |
10 innoink 2018 年 12 月 11 日 via Android @Newyorkcity 对,我说的有问题,testB 不会在 testA 之前出现 |
11 Newyorkcity OP |
12 innoink 2018 年 12 月 11 日 via Android @Newyorkcity 对了,你这个构造函数放在单独的 cpp 文件,是可以直接前置声明的,因为函数声明不需要知道完整的类型定义。。。 |
13 iceheart 2018 年 12 月 11 日 via Android 递归包含的,先踹一脚。 C 风格的代码就用指针或者引用 C++风格的就用抽象类 |