分类: C/C++
2010-07-07 20:42:39
这样一个架构:
一个主类,主界面是其成员类。另外有很多类与他有关(要刷新主界面),作为他的成员变量。但是只将必要的类(初始化、配置)在构造函数中实例。
主程序中,实例化这个主类。同时调用主类中的BindGui()方法,将其他的类在此方法中实例化。由于在这些类中往往要设置主界面的一些参数值,所以主类要作为这些类构造函数的形参。
这就有一个情况,如果在BindGui()中先后实例了A B两个类,而A是主类的成员类,假如主类名为s,作形参传入B的构造函数,那么按道理在B类中应该是可以调用s->A的成员函数,但事实证明这是不可以的。(我在B类构造函数中connect了A类的方法(QT),编译报错,connect 主界面上控件的槽是可以的)
一开始觉得这个应该涉及到拷贝构造函数的问题,这里没有定义拷贝构造函数,那么应该是默认的,由于成员类A没有在主类s的构造函数中实例,所以拷贝构造函数中应该也没有实例A,所以传过来的实参应该也就没有A的实例,故B中就没法调用A的方法,(这种想法应该不正确,待查阅)
仅从分析角度出发,如果在主类构造函数中实例A的话,应该不会有这用问题。但是经测试,给主类s添加一个成员类C,构造函数中实例C,此时在B中connect链接C的槽还是编译不过,就是直接调用C中方法也不行。于是说明,问题并不在这里——并不是实例化位置的问题。
又跑去再倒腾了一番,发现:主类的头文件中在声明主类前,将主类成员中将要用到的类都列了一遍,class A; class B;等等,在cpp中将这些类的定义头文件include进来。这样主类算是认识了这些成员类。但是在成员类的构造函数所在文件会不会找不到、不认识要调用的类的方法。果然,在B的构造函数文件中,#include “C.h”,一切编译错误都没有了,原来这个文件中只是包含了主类的头文件,而主类头文件没有包含其他的头文件,只是class了一下。