c++似乎不允许把自定义的类作为另一个类的构造器的参数?

2018-12-11 18:29:26 +08:00
 Newyorkcity

废话不多说,直接晒出全部代码,也很简洁..

--------------------

main.cpp

#include <iostream>
#include "statement.h"
int main(int argc, char **argv) {
	return 0;
}

statement.h --- 这个头文件将另外另个类的头文件都 include 进来

#ifndef _STATEMENT_H_
#define _STATEMENT_H_
#include "testA.h"
#include "testB.h"
#endif // !_STATEMENT_H_

testA.h --- 这个文件是 testA 类的头文件

#ifndef _TESTA_H_
#define _TESTA_H_
#include "statement.h"
class testA
{
public:
	testA(testB b);
private:
};
#endif // !_TEST_A_

testA.cpp --- 对应 testA.h

#include "testA.h"
testA::testA(testB b)
{
	//pass
}

testB 类的头文件和 cpp 和 testA 一模一样,这里干脆就不复制粘贴了,简单来说就是啥具体内容都没有..

然后编译不通过,是 VS2017,错误代码都是 C2061,『语法错误:标识符 testB 』出现两次,『语法错误:标识符 testA 』出现一次.

请问这个错误是为何?为什么要阻止这样的行为?应该怎么做?

谢谢

1074 次点击
所在节点    问与答
13 条回复
wbing
2018-12-11 18:41:10 +08:00
你在声明 A 的时候用到了 B,声明 B 的时候又用到了 A。
加个前置声明试试。在 testA.h 第三行之后放一行 class testB;
innoink
2018-12-11 18:57:06 +08:00
@wbing 他这个没办法,前置声明只能用与传指针的情况。否则 testb 的大小不知道,没办法编译生成最终传参代码。
feverzsj
2018-12-11 19:03:38 +08:00
你这是 java 写多了
Newyorkcity
2018-12-11 19:16:53 +08:00
@innoink 那请问有没有什么办法实现这种想法呢?谢谢
Newyorkcity
2018-12-11 19:21:03 +08:00
@innoink 噢,参数要求那种类的指针对吧!
innoink
2018-12-11 19:21:58 +08:00
@Newyorkcity 改成引用或者指针传参数,然后使用前置声明
innoink
2018-12-11 19:25:49 +08:00
其实本质上,你这个 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 最终不会进来
exonuclease
2018-12-11 19:26:56 +08:00
你就拿个引用不就行了 没看懂你要干嘛
Newyorkcity
2018-12-11 19:32:39 +08:00
@innoink 这个应该不是问题吧,statement.h 中也 include 了 testB.h,include testA.h 的时候 testA 里不会再 include testB.h 没关系,之后 statement.h 还有一个 include testB.h 要执行,这一步会把 testB include 进来的吧
innoink
2018-12-11 19:36:10 +08:00
@Newyorkcity 对,我说的有问题,testB 不会在 testA 之前出现
Newyorkcity
2018-12-11 19:39:27 +08:00
@innoink 那其实不管是怎么 include,总归是有一个先后顺序的,我这里 testA 构造函数要用 testB,testB 构造函数要用 testA,总有一个类的头文件在另一个类的头文件的内容的后面...

@wbing 诶卧槽,所以我试了一下把 class testA;放在 testB 类声明上面一行和 class testB;放在 testA 类声明上面一行,问题就解决了!~
innoink
2018-12-11 20:06:29 +08:00
@Newyorkcity 对了,你这个构造函数放在单独的 cpp 文件,是可以直接前置声明的,因为函数声明不需要知道完整的类型定义。。。
iceheart
2018-12-11 20:25:38 +08:00
递归包含的,先踹一脚。
C 风格的代码就用指针或者引用
C++风格的就用抽象类

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/516609

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX