关于GaLib247 EX5中
CompositeGenome::copy的理解
问题背景回顾:
EX5介绍了一种衍生自GAGenome类的合成基因组类(composite genome),该类包含了一个2DBinStr基因组和一个Bin2Dec基因组。程序利用steady-state GA来匹配2DBinStr部分中的2D模式,以及一个Bin2Dec部分中的数列。
该合成基因组类中定义了多个类成员函数以及构造函数等,现以copy为例对该类的合成原理进行说明,其成员函数具有如下形式的定义:
void
CompositeGenome::copy(const GAGenome & c){
if(&c != this && sameClass(c)){
GAGenome::copy(c);
CompositeGenome & bc = (CompositeGenome &)c; str->copy(*(bc.str));
b2d->copy(*(bc.b2d))
}
}
//————–|对copy的理解|————–
//由CompositeGenome genome(width, height, map, Objective, (void *)&mydata)
//可知CompositeGenome对象genome的一个参数是userData,即这里的mydata
//也就是说GAGenome的对象ga中携带着用户数据,即target和sequence
//另一方面,(从文件中读取的)输入数据是按如下方式赋值给myData的
//首先,定义一个包含两个指针变量的结构体
//typedef struct _CompositeData {
// short ** str;
// float * b2d;
//} CompositeData;
//然后,实例化该CompositeData类型的结构体,用以接收用户输入的数据
//CompositeData mydata;
// mydata.str = target;
// mydata.b2d = sequence;
//所以mydata中直接存放了两个被赋值的指针变量,也就是说参数c中间接地含有这两个指针变量,
//并且他们的值分别为target和sequence
//进一步地,当父类(GAGenome类型)对象c被强制转换为子类(CompositeGenome)对象bc时,
//bc从c中继承了全部的内容(包括数据,变量和方法)
//这时就子类对象bc就可以通过调用其指针型数据成员str和b2d来获取父类对象传递过来的数据了
//———————————————