正确处理类的复合关系——新标准c++程序设计

  假设要编写一个小区养狗管理程序,该程序需要一个“主人”类,还需要一个“狗”类。狗是有主人的,主人也有狗。假定狗只有一个主人,但一个主人可以有最多10条狗。该如何处理“主人”类和“狗”类的关系呢?下面是一种直观的写法:

#include<iostream>
using namespace std;
class CDog;
class CMaster
{
	CDog dogs[10];
	int dog_num;
};
class CDog
{
	CMaster m;
};
int main()
{
}

  这种写法是无法通过编译的。因为尽管提前对CDog类进行了声明,但编译到第4行时,编译器还是不知道CDog类的对象是什么样的,所以无法编译定义dog对象的语句。而且这种“人中有狗,狗中有人”的做法导致了循环定义。避免循环定义的方法是在一个类中使用另一个类的指针,而不是对象作为成员变量。例如:

#include<iostream>
using namespace std;
class CDog;
class CMaster
{
	CDog* dogs[10];
	int dog_num;
};
class CDog
{
	CMaster m;
};
int main()
{
}

  上面这种写法在第4行定义了一个CDog类的指针数组在为CMaster类的成员对象。指针就是地址,所以编译器编译到此时不需要知道CDog类是什么样子。这种写法的思想是:当一个CMaster对象养了一条狗时,就有new运算符动态分配一个CDog类的对象,然后在dogs数组中找一个元素,让它指向动态分配的CDog对象。

  这种写法还是不够好。问题出在CDog对象中包含了CMaster对象。在多条狗的主人相同的情况下,多个CDog对象中的CMaster对象都代表同一个主人,这造成了没有必要的冗余——一个主人用一个CMaster对象表示足矣,没有必要对应于多个CMaster对象。而且,在一对多的情况下,当主人的个人信息发生变化时,就需要将与其对应的、位于多个CDog对象中的CMaster成员变量m都找出来修改,这毫无必要,而且麻烦。

  正确写法:

#include<iostream>
using namespace std;
class CMaster;
class CDog
{
	CMaster* pm;
};
class CMaster
{
	CDog dogs[10];
	int dog_num;
};
int main()
{
}

  这样,主人相同的多个CDog对象,其pm指针都指向同一个CMaster对象。实际上,一个主人未必都养10条狗,因此处于节省空间的目的,在CMaster类中设置CDog类对象的指针数组,而不是对象数组,也是一种写法

 

 

新标准c++程序设计

原文链接: https://www.cnblogs.com/l2017/p/8260415.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    正确处理类的复合关系------新标准c++程序设计

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/267481

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 下午6:35
下一篇 2023年2月14日 下午6:36

相关推荐