温故知新——C++两个相互关联的类

我们都必须意识到,写程序其实是一个心思要细腻的活~

一开始,我的代码大概是这个样子的:

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;

 

posted @ 2015-06-11 23:20  P.wang  阅读(614)  评论(0编辑  收藏  举报