我们都必须意识到,写程序其实是一个心思要细腻的活~
一开始,我的代码大概是这个样子的:
class B; class A{ public: A() {} A(int a) : id(a) {} private: B b; }; class B{ public: B() {} B(int b): num(b) {} private: A a; };
很显然,我没有能够成功编译~我承认,上面的代码我都没有仔细去想,就写出来了~最近烦心事比较多。
上面的代码,有一个严重的问题是,相互迭代:
如果上面的代码能够成功执行,会发生:
class A中有一个class B的成员,于是,编译器去初始化B,于是进入B中,发现class B有一个A的成员,于是初始化A。。。就这么无穷无尽的初始化下去
还好编译器阻止了这一切~
进一步改进:
class B; class A{ public: A() {} A(int a) : id(a),b(new b()) { } private: B* b; }; class B{ public: B() {} B(int b): num(b) {} private: A a; };
感觉这样能够解决问题~实际上,你编译上面的代码,会得到:
”A(int a) : id(a),b(new b())“ Error: incomplete type is not allowed
这是什么错误?仔细的回想下代码,我们只声明了class B,没有B的定义。
知道错在哪里就容易修改了,代码就不上了,简单说一下
在类的外部new b(),传入指针给A的构造函数,初始化B* b;