怎么从文本生成对象?

胖和尚minifat 2003-09-13 03:02:54
我现在想从一个文本生成一系列对象。文本的内容包括了对象的名字和属性名字,类型,属
性值。由于对象类型和属性都比较多。。。不知道该怎么写这个程序,还望热心人帮忙。
...全文
40 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Skt32 2003-09-13
  • 打赏
  • 举报
回复

呵呵,比较容易。 看看下面这个就明白了。

VC/Delphi工程解析器源代码 详细信息 < 字符串处理 >

本代码可以读取VC/Delphi的工程文件进行解析。

[代码性质] VC完整应用程序代码
[代码作者] 李晓飞
[文件大小] 151K

http://www.vckbase.com/document/viewdoc.asp?id=569

[更新日期] 2003-3-4 19:29:00
[下载次数] 2794
http://www.vckbase.com/code/downcode.asp?id=1810
mikeshi 2003-09-13
  • 打赏
  • 举报
回复
其实,这个东东分析下来,需要以下几个步骤:
一、需要一个方法来读取数据
二、需要一个容器来存放新生成的对象,Yssss1980(浪子雪影) 好像是用vector的吧,其实其他的容器也可以,像QT里好像是使用Stack来装的。BTW,你和我同岁,呵呵呵呵
三、容器里如果存放的是指针还方便一点,如果要存放对象的复制品,那就麻烦点了,需要一种叫做代理类的类(C++里沉思录里有描述,本人也没有看的太明白,呵呵)
Yssss1980 2003-09-13
  • 打赏
  • 举报
回复
排版不太好,估计没人看得懂

赫赫,别人都说我写程序可读性不是很强,不好懂
Yssss1980 2003-09-13
  • 打赏
  • 举报
回复
呵,我这里刚好有一个实现,给你看看吧


//Module.h
#if !defined _MODULE_H
#define _MODULE_H

#include <vector>
#include <string>

#define DECLARE_MODULE(module_name) \
public: \
static CModule* NewInstance(){ return new module_name;}; \
static CModuleManager::stModuleDefine s_clMD;

#define IMPLEMENT_MODULE(module_name) \
CModuleManager::stModuleDefine module_name::s_clMD(#module_name,&(module_name::NewInstance));

using namespace std;
class CModule
{
public:
CModule(){};
virtual ~CModule(){};
virtual void Start()=0;
virtual void Stop()=0;
virtual void DispatchMessage(DWORD msg)=0;
};

typedef CModule* (*CreateFn)(void);
class CModuleManager
{
public:
struct stModuleDefine
{
stModuleDefine(const char *pstrModuleName,CreateFn pfnCreate)
{
this->m_strModuleName=pstrModuleName;
this->m_pfnCreate=pfnCreate;
vector<stModuleDefine>& theVector=GetModuleDefineVector();
theVector.push_back(*this);
}
string m_strModuleName;
CreateFn m_pfnCreate;
};

static CModule* CreateModule(const char *pstrModuleName)
{
vector<stModuleDefine>& theVector=GetModuleDefineVector();
int vSize=theVector.size();
for(int i=0;i<vSize;i++)
{
if(theVector[i].m_strModuleName==pstrModuleName)
{
return theVector[i].m_pfnCreate();
}
}
return 0;
};

static vector<stModuleDefine>& GetModuleDefineVector()
{
static vector<stModuleDefine> s_clModuleDefineVector;
return s_clModuleDefineVector;
}
};
#endif

//Test.cpp
#include "Module.h"
#include <iostream>

class CTestModule:public CModule
{
DECLARE_MODULE(CTestModule)
public:
CTestModule(){}
virtual ~CTestModule(){}
virtual void Start(){cout<<"CTestModule start"<<endl;}
virtual void Stop(){cout<<"CTestModule Stop"<<endl;}
virtual void DispatchMessage(DWORD msg){cout<<"CTestModule DispatchMessage"<<endl;}
};
IMPLEMENT_MODULE(CTestModule)

class CTestModule2:public CModule
{
DECLARE_MODULE(CTestModule2)
public:
CTestModule2(){}
virtual ~CTestModule2(){}
virtual void Start(){cout<<"CTestModule2 start"<<endl;}
virtual void Stop(){cout<<"CTestModule2 Stop"<<endl;}
virtual void DispatchMessage(DWORD msg){cout<<"CTestModule2 DispatchMessage"<<endl;}
};
IMPLEMENT_MODULE(CTestModule2)


int main()
{
CModule *m=CModuleManager::CreateModule("CTestModule2");
m->Start();
return 0;
}

////////////over

基本上是学MFC
不过稍微简化了一点
ningzhiyu 2003-09-13
  • 打赏
  • 举报
回复
看见过类似的实现……不过我自己也不是很清楚(主要是没有认真看完)
大概是这样的思路:
创建一个类,成员如下:
名称:char* name;
属性:采用void*的指针,同时用一个变量用于记录该指针的指向类型。
(如果属性多,可以考虑用二重指针,记住每个指针都应该有个记录其类型的变量,方便以后的操作)

假设文本数据如下:(只有一个属性的)
objectname:ob1#propertyname:p1#valuetype:int#value:10#
objectname:ob2#propertyname:p1#valuetype:long#value:10#......

可以先建立一个enum来记录可能的属性类型
如:
enum valueType{
value_int,
value_long,
value_char,
...
}
建立类
class ObjT {
const char * str_objName;
void * m_valueAddress;
valueType m_valueType;
}
读入文本数据以后,每读入一个objectname就申请一个对象的内存,其指针存放可以用数组也可以用链表(看你的爱好了),根据文本的说明提示,申请适合大小的内存,把void*指针指向它就是了,并记录相应的类型,(方便后来的运算操作)。

如果是多个属性,可能直接为属性建立一个类或者结构方便解,然后再ObjT中放置相应的二重指针(一重指针的话就要使用链表了吧)。

简单说就是这样了。
期间涉及关键词的比较,分界符的辨识,各种类型的值的读取……都是对字符串的操作了。
xghost 2003-09-13
  • 打赏
  • 举报
回复
MFC中有对象系列化的一对宏可以这样做

64,681

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧