动态创建类的问题

jun_01 2006-08-20 10:35:34
假设ClassA为基类. ClassA1,ClassA2,ClassA3都为它的派生类.

随机生产一个数,当随机数为1时,new 一个ClassA1,为2时new 一个ClassA2.

我能想到的是用一个case语句,但这样实在不爽,不知道有没有更好的办法?

ClassA *pCls;
switch(i){
case 1:
pCls = new ClassA1;
break;
case 2:
pCls = new ClassA2;
break;
case 3:
pCls = new ClassA3;
break;
}
...全文
312 22 打赏 收藏 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxshzf 2006-10-24
  • 打赏
  • 举报
回复
mark
runrunrun 2006-08-26
  • 打赏
  • 举报
回复
可以用MFC里的宏 DECLARE_DYNAMIC
jun_01 2006-08-26
  • 打赏
  • 举报
回复
##什么意思呀???
kzo494 2006-08-26
  • 打赏
  • 举报
回复
如果要new 3个类的话可以把a=1+rand()%2改为

a=1+rand()%3
if(a=1)
....
if(a=2)
.....
else
....
kzo494 2006-08-26
  • 打赏
  • 举报
回复
用srand(seed),rand()
随机产生1,2两个数
不同的时间产生的数不一样
void main()
{
srand((unsigned)time(NULL));
a=1+rand()%2;
if(随机为1)
new A
else
new B
}

因该可以满足你的随机要求
jun_01 2006-08-26
  • 打赏
  • 举报
回复
哦哦哦,这么强???

不过我现在的类又扩充了功能,构造函数的参数都不同了,现在彻底没戏了,只能用case。。。。
hurryboylqs 2006-08-23
  • 打赏
  • 举报
回复
其他方法均不符合楼主想要的那种,也只有cenchure(达到) 兄所提的最简单最直接的了。
hurryboylqs 2006-08-23
  • 打赏
  • 举报
回复
就用楼上cenchure(达到) 兄弟的方法,使用强连接“##”!!
cenchure 2006-08-23
  • 打赏
  • 举报
回复
#define CREATECLASS(N) new ClassBaseName##N
这样直接点 ,不用建立什么factory
奥爸 2006-08-23
  • 打赏
  • 举报
回复
这个是一个简单的例子
#include <vector>
#include <iostream>

using namespace std;

class CBase
{
public:
CBase() {}
virtual ~CBase(){}

virtual CBase* copy()
{
CBase * pBase = new CBase();
return pBase;
}

virtual void printf() { cout << "cbase" <<endl; }
};

class CBase1 : public CBase
{
public:
CBase1() {}
virtual ~CBase1(){}

virtual CBase* copy()
{
CBase * pBase = new CBase1();
return pBase;
}

virtual void printf() { cout << "cbase1" <<endl; }
};

class CBase2 : public CBase
{
public:
CBase2() {}
virtual ~CBase2(){}

virtual CBase * copy()
{
CBase * pBase = new CBase2();
return pBase;
}

virtual void printf() { cout << "cbase2" <<endl; }
};

int main(int argc , char ** argv)
{
vector <void *> vecClass;

//CBase 对应 0 CBase1 对应 1 CBase2 对应 2 根据 vecClass的位置
//如果不是对应数字的话,可以放到map里面根据key进行查找
vecClass.push_back(new CBase);
vecClass.push_back(new CBase1);
vecClass.push_back(new CBase2);

int i;

cout << "input integer :" ;
cin >> i ;

int count= vecClass.size()-1 ;

if ( (i >=0) && (i < count ) )
{
CBase *pBase = ( (CBase *)vecClass[i] )->copy();
pBase->printf();
delete pBase;
}
else
{
cout <<"input integer No. error!" << endl;
}

for ( int j = 0; j<count; ++j )
{
CBase *pBase = (CBase *)vecClass[j] ;
delete pBase;
}

return 0;
}
jun_01 2006-08-22
  • 打赏
  • 举报
回复
哦,看来没必要用那些反射之类的了??
xingzaicpp 2006-08-22
  • 打赏
  • 举报
回复
就这样,是最简单的,楼主,我们目前项目用到的比你复杂,我们是用一个字符串和一个类对应,但看样子你也不需要这么复杂,思想差不多 所有的技术,最简单实现是最好的,大家都懂
楼主最好定义一些宏, 或者c++的const
const CLASSA1 = 1;
const CLASSA2 = 2;
...
swict(type)
{
case CLASSA1:
case CLASSA2:
}
E17 2006-08-22
  • 打赏
  • 举报
回复
这个方法可以啊...似乎没有问题
奥爸 2006-08-22
  • 打赏
  • 举报
回复
只是让你参考MFC
jun_01 2006-08-22
  • 打赏
  • 举报
回复
“把每个类都注册一下,存到一个链表里面”不大明白呀。。。
奥爸 2006-08-21
  • 打赏
  • 举报
回复
如果必须要实现的话,可以参考mfc的类库结构

把每个类都注册一下,存到一个链表里面,搜索一下链表,根据类的信息,找到该类之后,返回一个对象的拷贝
奥爸 2006-08-21
  • 打赏
  • 举报
回复
楼主的,switch 的方法本身就很好了
即使增加新的类的话也不会变动很大,而且还容易理解
不要为了什么灵活之类的东西,费很大的劲,简单来说就是 简单问题复杂话
yzcurry 2006-08-21
  • 打赏
  • 举报
回复
考虑之中,帮兄弟你定一下,后面肯定有人帮你的
jun_01 2006-08-21
  • 打赏
  • 举报
回复
晕,没人啊。。。
superarhow 2006-08-21
  • 打赏
  • 举报
回复
不想写case就用宏吧
加载更多回复(2)

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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