这个问题有点偏,呵呵:),可能也有点难!如何通过一个字符串来建立一个类的对象?

flyperson 2002-05-17 02:38:54
如何通过一个字符串来建立一个类?如下面:
String Button="File"; //定义一个字符串
Class CTest{
CTest();
............
} //定义一个类

我现在想创建一个CTest的对象,对象名为File,请问怎么做?能够这样做么:
CTest Button=new CTest();//创建对象,对象名为File

对谢!

...全文
49 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
herohowk 2002-05-20
  • 打赏
  • 举报
回复
#define MyCreateClass((class),(name)) #class #name
flyperson 2002-05-20
  • 打赏
  • 举报
回复
呵呵,up
flyperson 2002-05-20
  • 打赏
  • 举报
回复
没人清楚吗?如果真的没人,我今晚结帖吧:)
flyperson 2002-05-20
  • 打赏
  • 举报
回复
谢谢各位的帮助!:),但是还有点问题。

lanzhengpeng2(兰征鹏):呵呵,我没有说清楚。在你的程序中有这样一句话TestClass * p= (TestClass *)CreateClass("TestClass");,我的希望的问题是我有一个字符串String *str="p",我怎么由这个"p"来生成你程序中的*p,就象宏替换一样,但要求是在程序运行中实现这个功能。

visualtree(梦想依旧):你的方法可行,但不好:)。如果用过Foxpro的人应该知道Foxpro里面有一个行替换的功能,我要实现的就是这种行替换的功能。

各位工作愉快!

flyperson 2002-05-20
  • 打赏
  • 举报
回复
问题没搞定,就此吧,谢
flyperson 2002-05-20
  • 打赏
  • 举报
回复
提贴!
flyperson 2002-05-20
  • 打赏
  • 举报
回复
herohowk():能否清楚点?:)多谢
zheng_can 2002-05-17
  • 打赏
  • 举报
回复
我觉得他所要求的并不是动态生成
可能 visualtree(梦想依旧) 才最满足题目的要求
只是实现方法有点不好,有待改进
陈硕 2002-05-17
  • 打赏
  • 举报
回复
请看侯捷先生的《多型与虚拟》第二版,第六章,网上有免费试读。
visualtree 2002-05-17
  • 打赏
  • 举报
回复
为什么不用map呢
map<string,baseclass &> mapClass;
typedef map<string,baseclass &>::const_iterator CI;
for(CI p=mapClass.begin();p!=mapClass.end();++p)
{ switch(p->first)
{
case class1name:
p->second()=new class1;
break;
case ....
}
}

lanzhengpeng2 2002-05-17
  • 打赏
  • 举报
回复
反过来考虑就好了,每个类有个名称,有个跟名称一样的名字,并且可以可以根据名字唯一确定一个名称。
这样做,你需要个类工厂的东西,能够注册类(包括类的创建器和名称),创建类。
下面是一个最简单的Example:

class RTTIBASE;

void RegisterClass(RTTIBASE * );
void * CreateClass(const char * name);

class RTTIBASE
{
friend void RegisterClass(RTTIBASE * );
friend void * CreateClass(const char * name);

RTTIBASE * next;
public:
const char * name;
virtual void * CreateObj() = 0;

RTTIBASE(const char * s) : next(NULL),name(s)
{
RegisterClass(this);
}
};

template<class T>
class RTTIIMPL : public RTTIBASE
{
virtual void * CreateObj()
{
return new T;
}
public:
RTTIIMPL(const char * s)
:RTTIBASE(s)
{

}
};

RTTIBASE * g_RTTIHeader = NULL;

void RegisterClass(RTTIBASE * rtti)
{
if(g_RTTIHeader)
g_RTTIHeader->next = rtti;
else
g_RTTIHeader = rtti;
}

void * CreateClass(const char * name)
{
RTTIBASE * p = g_RTTIHeader;
while(p)
{
if(!strcmp(name,p->name))
return p->CreateObj();
p = p->next;
}
return NULL;
}

#define RTTI_DECLARE( Name )\
friend class RTTIIMPL< Name >;\
static RTTIIMPL< Name > sm_ThisRTTI;

#define RTTI_IMPLEMENT(Name)\
RTTIIMPL< Name > Name::sm_ThisRTTI(#Name)


class TestClass
{
public:
int m_i;
RTTI_DECLARE(TestClass);

};

RTTI_IMPLEMENT(TestClass);


int main(int argc, char* argv[])
{
TestClass * p = (TestClass *)CreateClass("TestClass");

return 0;
}
flyperson 2002-05-17
  • 打赏
  • 举报
回复
能不能够马上给我一个example呢?小点就行
flyperson 2002-05-17
  • 打赏
  • 举报
回复
kary(BCBuider回复):是啊,BCBuilder里是怎么做的?我知道用new创建一个VCL控件,:)。怎么跟数据库中的记录对应起来呢

谢谢
kary 2002-05-17
  • 打赏
  • 举报
回复
我说他题意不清。
其实他也就要一个能存盘的,然后读取得时候重新将所有的数据读回来。
用VC的动态创建吧。
flyperson 2002-05-17
  • 打赏
  • 举报
回复
shizumaru(绯雨闲丸):是动态生成,只是还没有看过MFC:)。我采用C++ builder作工程。

swingerleung(大盗C++):从数据库中读出来的记录是字符串呢。比如:退出按钮的记录为:"Exit",按钮上的标签为"退出系统",我能够把这个字符串"Exit"作为对象名吗?呵呵
swingerleung 2002-05-17
  • 打赏
  • 举报
回复
做一个Struct如何?
Struct里有两个成员:
一是指向对象的指针,二是对象的名.
用的时候建一个该Struct的数组存放这些资料
SHIZUMARU 2002-05-17
  • 打赏
  • 举报
回复
你好象是想做动态生成吧?看深入浅出MFC(第二版)第三章。
flyperson 2002-05-17
  • 打赏
  • 举报
回复
在作应用时,我想把我的应用界面上的VCL组件(包括属性)全部放到放到一个数据库中,在程序运行时从数据库中读取控件名来动态的创建界面,如按钮阿、菜单阿。。。。。。:)。:)
Stephen_Ma 2002-05-17
  • 打赏
  • 举报
回复
不行不行。
kary 2002-05-17
  • 打赏
  • 举报
回复
怪!题意不清+
加载更多回复(1)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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