C++多头文件包含问题,急

来源:百度知道 编辑:UC知道 时间:2024/05/21 09:11:37
问题描述:
软件系统(运行在linux系统上)中有两个模块A和B
A和B两个模块各自有许多C++文件(.cc)和.h头文件

现在的情况是:
B模块需要通过调用A模块中的某个函数获得一个数据,这个函数如下定义:
type1 func(type2 a1,type3 &a2);//a1是输入参数,a2是输出参数
即,B模块需要调用A模块中定义的func函数来获得a2,

现在有个规定:为了模块化以及可维护性B模块不能包含A模块自己定义的头文件,A模块也不能包含B模块

定义的头文件(如果不遵守这个约定的话,系统中的很多模块相互交叉引用别人的头文件形成错综复杂的关

系,难于维护)

A和B两个模块要交互数据,是通过相互的接口函数:
模块B要用模块A中的私有数据A##a时,是通过调用A模块提供的接口函数get_A##a()来实现,反之亦然。

现在B模块需要获得A模块定义的私有变量a2,就通过下面的调用完成:
func(a1,a2);//a1是输入参数,a2是输出参数

由于func函数在A模块中的某个头文件A####1.h里定义了,但是B模块又不能包含A####1.h,可以通过

extern type1 func(type2 a1,type3 &a2);来解决;

问题来了:
a2的类型type3也是模块A中自己定义的一个数据类型,在A模块中自己的头文件A####2.h中定义了
struct type3{....};
但是这个数据类型的定义并不在模块B中的文件中,所以在B模块编译时出现了类型type3未定义,

而类型是不能通过extern 来解决的,又由于上面的规定我不能包含A模块中的头文件,所以这个问题一直没

有解决,有人提出一个结局方案,将数据类型封装到一个函数里,但是数据类型怎么封装到函数中,通过

函数带回来呢?

希望大家能给个解决方案,万分感激

小弟先拜谢了

当你需要定义某一个数据类型的对象时,该数据类型的完整定义是必须让编译器见到的,否则编译工作无法继续下去。“将数据类型封装到函数中”,我也是初学者,这种做法我实在是没见过。但是你可以试试设计模式中的工厂模式,即把函数定义成返回一个接口类型/基类类型的指针,这样可以在函数中返回具体类型。

加一个头文件,这些就都解决了。
将A,B都必须用到的数据类型声明在另一个头文件中。不知道是我想的太简单哈还是,你们项目整得太专业化了,我之前接触的项目就是这么干的。

如果你在B模块里include A模块的头文件都觉得“难以维护”, 那么你在B模块里重写一遍A模块的函数类型不是更难以维护?

一个模块要使用另一个模块里的东西而不能include适当的头文件, 如果这样的要求理由成立,还要头文件干啥用。 所谓“错综复杂的关系”,所谓“难以维护”根本讲不通。 这个要求不符合c++程序一般的组织形式, 也不合理。

如果你非要这么做,既然都重写函数原型了, 为什么不重写一下结构, 用同样的名字

那么长看完都晕了