废话不多说,直接晒出全部代码,也很简洁..
--------------------
#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
wbing 2018-12-11 18:41:10 +08:00 via iPhone 2
你在声明 A 的时候用到了 B,声明 B 的时候又用到了 A。
加个前置声明试试。在 testA.h 第三行之后放一行 class testB; |
3
feverzsj 2018-12-11 19:03:38 +08:00
你这是 java 写多了
|
4
Newyorkcity OP @innoink 那请问有没有什么办法实现这种想法呢?谢谢
|
5
Newyorkcity OP @innoink 噢,参数要求那种类的指针对吧!
|
6
innoink 2018-12-11 19:21:58 +08:00 via Android
@Newyorkcity 改成引用或者指针传参数,然后使用前置声明
|
7
innoink 2018-12-11 19:25:49 +08:00 via Android 1
其实本质上,你这个 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 19:26:56 +08:00 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 19:36:10 +08:00 via Android
@Newyorkcity 对,我说的有问题,testB 不会在 testA 之前出现
|
11
Newyorkcity OP |
12
innoink 2018-12-11 20:06:29 +08:00 via Android
@Newyorkcity 对了,你这个构造函数放在单独的 cpp 文件,是可以直接前置声明的,因为函数声明不需要知道完整的类型定义。。。
|
13
iceheart 2018-12-11 20:25:38 +08:00 via Android
递归包含的,先踹一脚。
C 风格的代码就用指针或者引用 C++风格的就用抽象类 |