请问下字符串变量怎么能转换为类名!!!!!!!

sno_guo 2013-07-01 05:25:09
一般的创建一个类 是这样的语句:
ClassXXX *temp=new ClassXXX();

但现在我要实现一个这样的一个功能:
把 ClassXXX 作为一个字符串传递给一个函数,由这个函数根据传过来的字符串来创建 一个类。

比如:
int createClass(char *p_cls)
{

......??????????这里我应该怎么做,谢谢!!!!
}


ps: 我记得可以把一个宏转换为字符串, 但这个就不清楚了,请教一下,谢谢!




...全文
367 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
sno_guo 2013-07-08
  • 打赏
  • 举报
回复
哦,最后的回答太感谢了,我的想法是 : 想重写函数几十个模块的软件, 并且以后可以在不破坏当前代码的情况下自由的增加和删除. 于是就想到了用map的形式来做. 好的,我去看看去,谢谢了!,结贴.!
橡木疙瘩 2013-07-08
  • 打赏
  • 举报
回复
使用映射表是最佳方案,loki库里有现成的实现,楼主可以看一下《C++设计新思维》中关于Factory的内容。
sno_guo 2013-07-08
  • 打赏
  • 举报
回复
谢谢各位的回答,看来我还是用宏的形式来实现吧, 这样一来我可以把所有的模块都一起增加和删除,并可以 用map等查询.... 谢谢了!
lm_whales 2013-07-08
  • 打赏
  • 举报
回复
看MFC 类库的实现代码。 另外,可以用 typeid和map,pair 来处理。
赵4老师 2013-07-02
  • 打赏
  • 举报
回复
更改代码至少有两种方法: 1.人直接去改 2.人通过运行程序自动去改(代码生成Code Generation)
BeanJoy 2013-07-02
  • 打赏
  • 举报
回复
一种思路:

#include <iostream>
#include <vector>

using namespace std;

vector<void *> vtClass;
class BaseClass
{
public:
virtual char *GetClassName(){ return NULL; };
virtual void *GetNewInstance(){ return NULL; };
};

#define CLASS_BEGIN(ClassName) class ClassName:public BaseClass\
{\
public:\
char *GetClassName(){ return m_pszClassName; }\
ClassName(char *pszClassName){m_pszClassName = pszClassName;vtClass.push_back(this);}\
void *GetNewInstance(){return (void *)new ClassName();}\
private:\
char *m_pszClassName;\
public:\
ClassName(){}\
private:

#define CLASS_END(ClassName) };ClassName g_##ClassName (#ClassName);

void *GetClass(char *pszClassName)
{
vector<void *>::iterator i;
for (i =vtClass.begin(); i !=vtClass.end(); ++i)
{
BaseClass *p = (BaseClass *)*i;
if (0 == strcmp(p->GetClassName(), pszClassName))
{
return p->GetNewInstance();
}
}
return NULL;
}


CLASS_BEGIN(Class1)
private:
int m_nP1;
float m_fP1;
void Func1();
public:
double m_dP1;
__int64 m_n64P1;
void Func2();
CLASS_END(Class1)

CLASS_BEGIN(Class2)
private:
int m_nP2;
float m_fP2;
void Func11();
public:
double m_dP2;
__int64 m_n64P2;
void Func22();
CLASS_END(Class2)


int main(int, char **, char **)
{
Class1 *p1 = (Class1 *)GetClass("Class1");
Class2 *p2 = (Class2 *)GetClass("Class2");
void *p3 = GetClass("Class3");
return 0;
}

结果如下:


添加新类的时候:
CLASS_BEGIN(ClassName)
// 这里定义成员变量和函数
CLASS_END(ClassName)

然后直接调用GetClass即可得到类的指针。
  • 打赏
  • 举报
回复
引用 5 楼 sno_guo 的回复:
谢谢两位的回答, 都可以实现。 但感觉 "zhao4zhong1"的 太局限了,假如一个类是一个模块,那么我每次增加一个模块,在管理模块的代码文件中(例如manager.cpp),都需要更改一下代码,这样感觉很不好。 turingo: 难道只能用宏的形式了吗, 假如我有一个字符串数组呢,数组里放了很多个模块,这样用宏定义也可以,但感觉还是有点笨重。呵呵 请问下有没有更好的方法呢,谢谢!
其他方法也基本上zhao4zhong1提供方法的变形。
sno_guo 2013-07-01
  • 打赏
  • 举报
回复
谢谢两位的回答, 都可以实现。 但感觉 "zhao4zhong1"的 太局限了,假如一个类是一个模块,那么我每次增加一个模块,在管理模块的代码文件中(例如manager.cpp),都需要更改一下代码,这样感觉很不好。 turingo: 难道只能用宏的形式了吗, 假如我有一个字符串数组呢,数组里放了很多个模块,这样用宏定义也可以,但感觉还是有点笨重。呵呵 请问下有没有更好的方法呢,谢谢!
赵4老师 2013-07-01
  • 打赏
  • 举报
回复
Class1 *p_class1;
Class2 *p_class2;
void *p_classn;
if (0==strcmp(p_cls,"Class1")) {p_class1=new Class1;p_classn=(void *)p_class1;}
else if (0==strcmp(p_cls,"Class2")) {p_class2=new Class2;p_classn=(void *)p_class2;}
图灵狗 2013-07-01
  • 打赏
  • 举报
回复
可以用宏来实现:

#define createClass(name) \
  Class##name * temp = new Class#name();
引用 楼主 sno_guo 的回复:
一般的创建一个类 是这样的语句: ClassXXX *temp=new ClassXXX(); 但现在我要实现一个这样的一个功能: 把 ClassXXX 作为一个字符串传递给一个函数,由这个函数根据传过来的字符串来创建 一个类。 比如: int createClass(char *p_cls) { ......??????????这里我应该怎么做,谢谢!!!! } ps: 我记得可以把一个宏转换为字符串, 但这个就不清楚了,请教一下,谢谢!
sno_guo 2013-07-01
  • 打赏
  • 举报
回复
谢谢回复。 我上面说的很清楚, 最后一行的意思是: 我记得可以用一个宏把一个变量转换为字符串,但我想要的这种情况 不知道该怎么做。谢谢!
Jackie_Zhu 2013-07-01
  • 打赏
  • 举报
回复
你指的是宏的字符串连接吗? #define init(class_name) user_##class_name::Initdata() 这个貌似做不到你说的那样

65,187

社区成员

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

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