首先说明一下,不可以用递归算法,递归算法我已经实现了,我想换其它算法实现。一个类A它有n个子类A1和A2,.......An。
Ai是一般项(这里的一般项不一定是第一级子类),它可能有子类也可能没有子类。(这个我可以判断出来,不用大家担心)举例说明:Ai可以是1级子类A2,也可以是A2的子类Am或者更下面的子类Aj。Ai具有一些属性(每一个子类的属性不完全相同。)我可以遍历所有这些父类和子类的属性集合,也可以判断任意给出一个属性名字时,判断这个属性是否附属于某个名字的类。我可以做一个函数void Fun():把某一层辈份的父类(比如A2)的所有子类(比如叫A11,A12,A13,A14......A1k)遍历.
递归算法是重复调用Fun();现在谁能给我一个方法,不用递归算法,而遍历所有类及其属性。
Ai是一般项(这里的一般项不一定是第一级子类),它可能有子类也可能没有子类。(这个我可以判断出来,不用大家担心)举例说明:Ai可以是1级子类A2,也可以是A2的子类Am或者更下面的子类Aj。Ai具有一些属性(每一个子类的属性不完全相同。)我可以遍历所有这些父类和子类的属性集合,也可以判断任意给出一个属性名字时,判断这个属性是否附属于某个名字的类。我可以做一个函数void Fun():把某一层辈份的父类(比如A2)的所有子类(比如叫A11,A12,A13,A14......A1k)遍历.
递归算法是重复调用Fun();现在谁能给我一个方法,不用递归算法,而遍历所有类及其属性。
解决方案 »
- 如何根据clistbox 子项目标题 获取索引号?
- 请教,如何开发一个基于Gecko的浏览器
- 如何修改“控制面板”==〉“区域和语言选项”==〉“高级”中的语言??setLocale(),以后再加分
- 结构定义 typedef struct tagXXXXX{};中的“tag”是什么意思?
- 寻一个画曲线图的东东?
- 帮忙
- [学习SDK]超简单问题“如果删除List Control控件中的当前选择项?”,马上结贴给分!
- 使用傅立叶算法把时域信号变成频域信号了,但怎么处理频域信号呢?
- CFrameWnd中,在TOP上已经有两个ControlBar了,如何得到此两个中的任意一个指针?
- 谁有关于三维几何算法的资料.
- 关于线程重复创建的简单问题,求解!
- 如何获取机器中存取的cookie文件内容?
#include <Zoe1.h>
#include <Schema.h>
#include <assert.h>
#include <Tanker.h>
#include <Server_resolve.h>
#include <iostream>using namespace std;
using namespace Ablaze;
ObjectDictionary* pDic = new ObjectDictionary();
char pText[800];
char pWord[200];
char Text[160];void TraverseClsTree(FILE *ptxtList,const char *pBaseClassName)
{
if (!ptxtList)
{
return;
} int i=0,k,num;
const char *pCurrentClsName=pBaseClassName;
const char* record[30];////记录相同辈份兄弟类的元素
const char* attrName = NULL;
ClassSchema schema; schema=pDic->GetFirstSubClass(pCurrentClsName);
if (schema.IsNull())
{
return;
} const char *pClsName=schema.GetClassName();
if (pClsName==NULL)
{
return;
}
Text[0]='\0';
bool flag=false;
IDataSchema *IdataSchema = NULL; k=pDic->GetSubClassCount(pCurrentClsName,false);////获取子类的个数。 while(i!=k)
{
if ( pClsName == NULL ) break;
memset(pText, 0, 500);
memset(pWord, 0, 80);
strcpy(pText,"Create table ");
strcat(pText,pClsName);//类名写到文本中去
strcat(pText,"\n ("); IdataSchema=pDic->GetDataSchema(pClsName);
cout << endl;
cout << "CLASS: " << pClsName << ", SchemaName: " << IdataSchema->ClassName() << endl;
cout << "----------------------------------------------" << endl; bool b1=schema.CheckAbstract();
bool b2=pDic->IsClassDynamic(pClsName);
//由schema把子类的类名和属性写到指定目录下。
attrName = pDic->BeginAttributeEnum();
while ( attrName != NULL )
{
bool b3=IdataSchema->IsAttrAttached(attrName,true);
if ( b3 ) {
cout << IdataSchema->ClassName() << " : " << attrName << endl;
}
if (!b1 && !b2 &&
b3)
{
flag=true;
sprintf(pWord,"\"%s\"",attrName);
unsigned int AttrID=pDic->GetAttributeID(attrName);
size_t Capacity=pDic->GetAttributeSize(AttrID);
num=pDic->GetAttributeType(AttrID);
switch (num)
{
case PARAM_TYPE_INVALID:
sprintf(Text," Invalid,\n");
break;
case PARAM_TYPE_CHAR:
sprintf(Text," char(%d),\n",Capacity);
break;
case PARAM_TYPE_SHORT:
sprintf(Text," short(%d),\n",Capacity);
break;
case PARAM_TYPE_INT:
sprintf(Text," int(%d),\n",Capacity);
break;
case PARAM_TYPE_LONG:
sprintf(Text," long(%d),\n",Capacity);
break;
case PARAM_TYPE_FLOAT:
sprintf(Text," float(%d),\n",Capacity);
break;
case PARAM_TYPE_DOUBLE:
sprintf(Text," double(%d),\n",Capacity);
break;
case PARAM_TYPE_BOOL:
sprintf(Text," bool(%d),\n",Capacity);
break;
case PARAM_TYPE_OBJECT:
sprintf(Text," object(%d),\n",Capacity);
break;
case PARAM_TYPE_STRING:
sprintf(Text," string(%d),\n",Capacity);
break;
case PARAM_TYPE_LIST:
sprintf(Text," list(%d),\n",Capacity);
break;
case PARAM_TYPE_VALUESET:
sprintf(Text," valueset(%d),\n",Capacity);
break;
case PARAM_TYPE_NVSET:
sprintf(Text," nvset(%d),\n",Capacity);
break;
case PARAM_TYPE_FULLTABLE:
sprintf(Text," fulltable(%d),\n",Capacity);
break;
case PARAM_TYPE_OBJECTSET:
sprintf(Text," objectset(%d),\n",Capacity);
break;
case PARAM_TYPE_DESCRIPTOR:
sprintf(Text," descriptor(%d),\n",Capacity);
break;
} if (strcmp(attrName,"UUID")==0)
{
strcat(Text,"[not null][primary key],\n");
}
//把属性类型写到pText里面去
strcat(pWord,Text);
strcat(pText,pWord);
} attrName = pDic->EnumNextAttribute();//遍历属性
}
IdataSchema->Release(); if (flag)
{
*(pText+strlen(pText)-2)='\0';////去除掉最后一个参数后面多余的comma
fprintf(ptxtList,"%s\n);\n",pText);
}
flag=false;
pCurrentClsName=pClsName;//将其覆写到pCurrentClsName中
record[i]=pCurrentClsName;//登记存储当前同等辈份的兄弟类元素
schema=pDic->GetSiblingClass(pCurrentClsName);////获得当前子类的兄弟类结构体
if (!schema.IsNull())
{
pClsName=schema.GetClassName();
}
else pClsName = NULL;
++i;
}
////下面递归
for (num=0;num<k;++num)
{
pClsName=record[num];
TraverseClsTree(ptxtList,pClsName);
}
}int main()
{
//根据对象字典初始化数据库工具
char *pDir="F:\\test\\SQL.txt";
FILE *ptxtList=fopen(pDir,"w");
const char *pBaseClassName = NULL;
const char* attrName = NULL;
// 根据系统缺省配置创建一个对象字典的实例
assert( pDic != NULL );
pBaseClassName=pDic->GetRootClass();
TraverseClsTree(ptxtList,pBaseClassName); //获取对象字典中定义的可实例化的类的个数
int InstantibleNum=pDic->GetInstantiableClassCount();
cout<<"可实例化的类的个数是:"<<InstantibleNum<<"\n";
//获取对象字典中定义的类的个数
int TotalNum=pDic->GetClassCount();
cout<<"类的总个数是:"<<TotalNum;
// 释放内存
fclose(ptxtList);
delete pDic;
return 0;
}