免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4791 | 回复: 5
打印 上一主题 下一主题

[C++] 如何使用字符串中的数据类型来定义变量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-22 11:20 |只看该作者 |倒序浏览
10可用积分
简单的说:如果有一个字符串"int" ,如何用这个"int" 来定义int 型的变量。
字符串中的可能是 "string",或者其他的。

代码如下:
A();
B(vector<string> vectType);


A()
{
    vector<string> structType;

    structType.push_back("int");
    structType.push_back("string");


    B(structType);
}

B(vector<string> vectType)
{
        //在这里得到的vectType[1] 是“int”字符串,如何在后面使用这个int 作为数据类型 来定义 变量???
}

谢谢大家。


===========================
感谢大家的帮忙

后来想到了一个简单的办法

B(vector<string> vectType)

//在这里得到的vectType[1] 是“int”字符串,如何在后面使用这个int 作为数据类型 来定义 变量???
if(strcmp(vectType[1].c_str(),"int"))
{
        int aaa;
        ...
}
else(strcmp(vectType[1].c_str(),"char"))
{
        char bbb;
        ...
}
...


[ 本帖最后由 gengxt001 于 2009-8-27 08:41 编辑 ]

最佳答案

查看完整内容

首先, 你要再三的、仔细的思考 : 为什么要这么做。如果依然需要, C++不适合做这种事情, 可以考虑换其他语言。如果还是要用C++ …… 要考虑以下一些问题:1. 工厂通过一个名字,来创建对象, 需要一个工厂。注意, 并不一定需要那种OO形式的工厂。2. 返回类型工厂到底返回什么?对于一个需要创建若干种产品的工厂, 返回值是不行的。只能返回指针。3. 返回基类指针可以是一个“抽象层次恰好合适的基类”, 比如:Shape* crea ...

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2009-08-22 11:20 |只看该作者

回复 #1 gengxt001 的帖子

首先,  你要再三的、仔细的思考 : 为什么要这么做。
如果依然需要, C++不适合做这种事情,  可以考虑换其他语言。
如果还是要用C++ ……  要考虑以下一些问题:

1. 工厂
通过一个名字,来创建对象, 需要一个工厂。
注意, 并不一定需要那种OO形式的工厂。

2. 返回类型
工厂到底返回什么?
对于一个需要创建若干种产品的工厂, 返回值是不行的。
只能返回指针。

3. 返回基类指针
可以是一个“抽象层次恰好合适的基类”, 比如:
Shape* createShape(const char* name) {
    if (strcmp(name,"circle" )==0)
        return new Circle;
    if (strcmp(name,"rectangle" )==0)
        return new Rectangle;
    // ...
}

肯定只能创建“注册过的产品”: 比如上面的 "circle"和 "rectangle"。
如何扩展这种注册方式, 而不是硬编码?  是另一个话题……

现在就可以用字符串来创建对象了:

Shape* /* 注意这里的类型,必须在编译时确定 */ s = createShape(vecType[0].c_str() );

要创建int, string? 可以效仿java的作法, 为基本类型做一个包装器


4. 返回void*
这是C/C++中, 可以泛指一切对象的类型

void* create(const char* name) {
    if (strcmp(name,"int" )==0 )
        return new int;
    if (strcmp(name,"string" )== 0 )
        return new std::string;
    // ...
}
如何扩展注册方式以及取消硬编码仍不讨论……


使用如下:
void* p = create(vecType[0].c_str() );
*static_cast<int*>(p) = 1212; // 一定要时刻记住p到底指向的是什么类型, 一旦搞错, game over
void* p2 = create(vectype[1].c_str() );
*static_cast<std::string*>(p2) = "1212";

5. boost::any
这是boost提供的一种类型安全的、泛指一切对象的组件。
可以将它想象成其他语言中的object, var之类的东西。

boost::any create(const char* name) {
    if (strcmp(name,"int" )==0 )
        return int();
    if (strcmp(name,"string" )== 0 )
        return std::string();
    // ...
}

boost::any var = create("int" );
if (int* pi = boost:any_cast<int*>(var)) {
    // var里确实是一个int
    *pi = 1212;
} else {
    // var里不是一个int, 哪出错了
}

boost::any的语法可能不是这样, 我忘了。



6. 销毁
除了boost::any会管理好资源, 其他的都需要自行管理, 比如:

delete s;
delete static_cast<int*>(p); // 一定不要转错了
delete static_cast<std::string*>(p2) // 同上



PS:
B(vector<string> vectType);
这样传参会复制整个vector——包括里面的所有string.

B(const vector<string>& vectType)
怎样?

[ 本帖最后由 OwnWaterloo 于 2009-8-22 12:35 编辑 ]

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2009-08-22 11:32 |只看该作者
没法实现,思路错了

论坛徽章:
0
4 [报告]
发表于 2009-08-22 11:34 |只看该作者
为什么错了呢?

论坛徽章:
0
5 [报告]
发表于 2009-08-22 11:57 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
6 [报告]
发表于 2009-08-22 11:59 |只看该作者
C++编译型的,没办法根据你的“int”来定义一个int变量,可以采取变通的办法来实现你的需求
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP