C++ 动态指定类型怎么处理?

qugjie 2015-03-24 10:03:22


我想实现的效果如下:

class pic
{
pic() {}
long getId() {return id; }
private:
long id;
}

class pic_01 : public pic
{
pic_01() {}
...
private:
...
}
class pic_02: public pic
{
pic_02() {}
...
private:
...
}

class pic_03: public pic
{
pic_03() {}
...
private:
...
}
class pic_04: public pic
{
pic_04() {}
...
private:
...
}


void function (long id)
{
class A db;
switch (long % 4)
{
case 0:
pic_01 p01 = db->load<pic_01>(id);
break;
case 1:
pic_02 p02 = db->load<pic_02>(id);
break;
case 2:
pic_03 p03 = db->load<pic_03>(id);
break;
case 3:
pic_04 p04 = db->load<pic_04>(id);
break;
}
}

采用什么技术把 switch case 简化啊?

...全文
534 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangyunzhao 2015-03-26
  • 打赏
  • 举报
回复
我觉得这个问题应该看看设计模式的书
jiht594 2015-03-25
  • 打赏
  • 举报
回复
引用 28 楼 jiht594 的回复:
[quote=引用 25 楼 bear234 的回复:] [quote=引用 24 楼 jiht594 的回复:] [quote=引用 22 楼 bear234 的回复:] 你知不知道map是什么?
你说的map是指表驱动法吗? 表驱动法能解决楼主的问题吗?解决我的例子就行, 一样的. 工厂模式呢? 你就解决我说的例子就行. 反射好像是可以, 不懂C#, 没用过. 讨论的也不是C#[/quote] 反射是JAVA 的机制 [/quote] 你不要回避我的问题. 作为"没听过设计模式的小屁孩", 我想知道怎么用设计模式消除我例子中的if else[/quote] 不好意思 没看到连接. 我去看一下
jiht594 2015-03-25
  • 打赏
  • 举报
回复
引用 25 楼 bear234 的回复:
[quote=引用 24 楼 jiht594 的回复:] [quote=引用 22 楼 bear234 的回复:] 你知不知道map是什么?
你说的map是指表驱动法吗? 表驱动法能解决楼主的问题吗?解决我的例子就行, 一样的. 工厂模式呢? 你就解决我说的例子就行. 反射好像是可以, 不懂C#, 没用过. 讨论的也不是C#[/quote] 反射是JAVA 的机制 [/quote] 你不要回避我的问题. 作为"没听过设计模式的小屁孩", 我想知道怎么用设计模式消除我例子中的if else
jiht594 2015-03-25
  • 打赏
  • 举报
回复
引用 26 楼 bear234 的回复:
[quote=引用 23 楼 jiht594 的回复:] [quote=引用 22 楼 bear234 的回复:] [quote=引用 21 楼 jiht594 的回复:] 工厂模式能根据未知值创建对象, 你确定? 不需要判断就知道生产那个对象?
你知不知道map是什么?[/quote] 不知道. 你说的map指的是什么? 能帮忙解释下我给的例子吗?[/quote] http://blog.163.com/tfn2008@yeah/blog/static/110321319201232991310112/ [/quote] 我说的是是设计模式的, 反射我刚才说了, 可以.
bear234 2015-03-25
  • 打赏
  • 举报
回复
引用 23 楼 jiht594 的回复:
[quote=引用 22 楼 bear234 的回复:] [quote=引用 21 楼 jiht594 的回复:] 工厂模式能根据未知值创建对象, 你确定? 不需要判断就知道生产那个对象?
你知不知道map是什么?[/quote] 不知道. 你说的map指的是什么? 能帮忙解释下我给的例子吗?[/quote] http://blog.163.com/tfn2008@yeah/blog/static/110321319201232991310112/
bear234 2015-03-25
  • 打赏
  • 举报
回复
引用 24 楼 jiht594 的回复:
[quote=引用 22 楼 bear234 的回复:] 你知不知道map是什么?
你说的map是指表驱动法吗? 表驱动法能解决楼主的问题吗?解决我的例子就行, 一样的. 工厂模式呢? 你就解决我说的例子就行. 反射好像是可以, 不懂C#, 没用过. 讨论的也不是C#[/quote] 反射是JAVA 的机制
bravery36 2015-03-25
  • 打赏
  • 举报
回复
消除if这种想法太傻了,判断是无处不在的,我们要做的是将判定简单化并控制判定的范围。比如说反射就是将判定放在了反射机制内部实现。
赵4老师 2015-03-25
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
不要低估编译器Release版对switch语句的优化功力。
不要低估编译器Release版对switch语句的优化功力。 理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。) 想单步switch语句对应Release版对应汇编,临时在switch语句前加一句DebugBreak(); 亲自看看编译器Release版对switch语句的优化结果(跳转表)
bear234 2015-03-25
  • 打赏
  • 举报
回复
引用 31 楼 jiht594 的回复:
[quote=引用 30 楼 bear234 的回复:] [quote=引用 29 楼 jiht594 的回复:] [quote=引用 28 楼 jiht594 的回复:] [quote=引用 25 楼 bear234 的回复:] [quote=引用 24 楼 jiht594 的回复:] [quote=引用 22 楼 bear234 的回复:] 你知不知道map是什么?
你说的map是指表驱动法吗? 表驱动法能解决楼主的问题吗?解决我的例子就行, 一样的. 工厂模式呢? 你就解决我说的例子就行. 反射好像是可以, 不懂C#, 没用过. 讨论的也不是C#[/quote] 反射是JAVA 的机制 [/quote] 你不要回避我的问题. 作为"没听过设计模式的小屁孩", 我想知道怎么用设计模式消除我例子中的if else[/quote] 不好意思 没看到连接. 我去看一下[/quote] // java code Class c = Class.forName("className"); Object obj=c.newInstance(); c++: 1) 实现反射机制 2) 上面的Object 改成你的class base.[/quote] 好吧. 我承认实现了. 不通过表驱动法+宏实现的.if else也是通过表驱动法消除的. 不过表驱动法自身就相当于一个工厂.[/quote] if else 本身是不能消除的 人类早就从数学上证明了为了构建一个完备的编程语言系统 顺序 条件 和 循环 是缺一不可而且互相不可替代的 但是编程语言系统是为了实现人和机器交流,而设计模式本身是针对人类而言的,解决的是在软件系统某些模块经常增删改的情况------这些地方如果不用任何设计模式,那么唯一能做的,就是用很多if else~~~ 而如果用设计模式,理论上这种问题是可以100%消除掉if else的,因为这里的问题并不是源自语言本身是否完备,而是源自类数量的变化-----这个问题是可以完全避免用if else的,但代价就是class的结构复杂化 因此,当你碰到一个地方------由于类数量的改变而出现大量使用ifelse的时候,一定是有一种设计模式可以消除掉这些ifelse的,如果你找不到,这一定是你的问题
jiht594 2015-03-25
  • 打赏
  • 举报
回复
引用 30 楼 bear234 的回复:
[quote=引用 29 楼 jiht594 的回复:] [quote=引用 28 楼 jiht594 的回复:] [quote=引用 25 楼 bear234 的回复:] [quote=引用 24 楼 jiht594 的回复:] [quote=引用 22 楼 bear234 的回复:] 你知不知道map是什么?
你说的map是指表驱动法吗? 表驱动法能解决楼主的问题吗?解决我的例子就行, 一样的. 工厂模式呢? 你就解决我说的例子就行. 反射好像是可以, 不懂C#, 没用过. 讨论的也不是C#[/quote] 反射是JAVA 的机制 [/quote] 你不要回避我的问题. 作为"没听过设计模式的小屁孩", 我想知道怎么用设计模式消除我例子中的if else[/quote] 不好意思 没看到连接. 我去看一下[/quote] // java code Class c = Class.forName("className"); Object obj=c.newInstance(); c++: 1) 实现反射机制 2) 上面的Object 改成你的class base.[/quote] 好吧. 我承认实现了. 不通过表驱动法+宏实现的.if else也是通过表驱动法消除的. 不过表驱动法自身就相当于一个工厂.
bear234 2015-03-25
  • 打赏
  • 举报
回复
引用 29 楼 jiht594 的回复:
[quote=引用 28 楼 jiht594 的回复:] [quote=引用 25 楼 bear234 的回复:] [quote=引用 24 楼 jiht594 的回复:] [quote=引用 22 楼 bear234 的回复:] 你知不知道map是什么?
你说的map是指表驱动法吗? 表驱动法能解决楼主的问题吗?解决我的例子就行, 一样的. 工厂模式呢? 你就解决我说的例子就行. 反射好像是可以, 不懂C#, 没用过. 讨论的也不是C#[/quote] 反射是JAVA 的机制 [/quote] 你不要回避我的问题. 作为"没听过设计模式的小屁孩", 我想知道怎么用设计模式消除我例子中的if else[/quote] 不好意思 没看到连接. 我去看一下[/quote] // java code Class c = Class.forName("className"); Object obj=c.newInstance(); c++: 1) 实现反射机制 2) 上面的Object 改成你的class base.
赵4老师 2015-03-24
  • 打赏
  • 举报
回复
参考VARIANT
赵4老师 2015-03-24
  • 打赏
  • 举报
回复
不要低估编译器Release版对switch语句的优化功力。
jiht594 2015-03-24
  • 打赏
  • 举报
回复
引用 22 楼 bear234 的回复:
你知不知道map是什么?
你说的map是指表驱动法吗? 表驱动法能解决楼主的问题吗?解决我的例子就行, 一样的. 工厂模式呢? 你就解决我说的例子就行. 反射好像是可以, 不懂C#, 没用过. 讨论的也不是C#
jiht594 2015-03-24
  • 打赏
  • 举报
回复
引用 22 楼 bear234 的回复:
[quote=引用 21 楼 jiht594 的回复:] 工厂模式能根据未知值创建对象, 你确定? 不需要判断就知道生产那个对象?
你知不知道map是什么?[/quote] 不知道. 你说的map指的是什么? 能帮忙解释下我给的例子吗?
bear234 2015-03-24
  • 打赏
  • 举报
回复
引用 21 楼 jiht594 的回复:
[quote=引用 20 楼 bear234 的回复:] [quote=引用 16 楼 jiht594 的回复:] [quote=引用 15 楼 bear234 的回复:] [quote=引用 12 楼 jiht594 的回复:] [quote=引用 10 楼 bear234 的回复:] [quote=引用 1 楼 jiht594 的回复:] 没有这种技术. 除非你能改变你的代码逻辑
小屁孩 你没听说过"设计模式"吗?[/quote] 你是想说简单工厂模式? 你看的啥书?说出来看看 你告诉我"现在需要用户输入一个数值, 数值1创建对象1, 数值2创建对象2, 你告诉我怎么回避这个if else"[/quote] 很简单, 用反射机制, c++没有反射机制但是可以用工厂模式实现[/quote] 工厂模式, 来个例子可以吗?例子: 一个未知值, 给据该值不同, 创建不同的类对象. 语言说一下也可以. 怎么不用if else[/quote] 建一个类 里面有个map<className, callbackFunction> 这样可以实现反射机制 如果你愿意可以用工厂模式包起来 不过一般人会用RTTI 但这样无法避免if else[/quote] 工厂模式能根据未知值创建对象, 你确定? 不需要判断就知道生产那个对象?[/quote] 你知不知道map是什么?
jiht594 2015-03-24
  • 打赏
  • 举报
回复
引用 20 楼 bear234 的回复:
[quote=引用 16 楼 jiht594 的回复:] [quote=引用 15 楼 bear234 的回复:] [quote=引用 12 楼 jiht594 的回复:] [quote=引用 10 楼 bear234 的回复:] [quote=引用 1 楼 jiht594 的回复:] 没有这种技术. 除非你能改变你的代码逻辑
小屁孩 你没听说过"设计模式"吗?[/quote] 你是想说简单工厂模式? 你看的啥书?说出来看看 你告诉我"现在需要用户输入一个数值, 数值1创建对象1, 数值2创建对象2, 你告诉我怎么回避这个if else"[/quote] 很简单, 用反射机制, c++没有反射机制但是可以用工厂模式实现[/quote] 工厂模式, 来个例子可以吗?例子: 一个未知值, 给据该值不同, 创建不同的类对象. 语言说一下也可以. 怎么不用if else[/quote] 建一个类 里面有个map<className, callbackFunction> 这样可以实现反射机制 如果你愿意可以用工厂模式包起来 不过一般人会用RTTI 但这样无法避免if else[/quote] 工厂模式能根据未知值创建对象, 你确定? 不需要判断就知道生产那个对象?
bear234 2015-03-24
  • 打赏
  • 举报
回复
引用 16 楼 jiht594 的回复:
[quote=引用 15 楼 bear234 的回复:] [quote=引用 12 楼 jiht594 的回复:] [quote=引用 10 楼 bear234 的回复:] [quote=引用 1 楼 jiht594 的回复:] 没有这种技术. 除非你能改变你的代码逻辑
小屁孩 你没听说过"设计模式"吗?[/quote] 你是想说简单工厂模式? 你看的啥书?说出来看看 你告诉我"现在需要用户输入一个数值, 数值1创建对象1, 数值2创建对象2, 你告诉我怎么回避这个if else"[/quote] 很简单, 用反射机制, c++没有反射机制但是可以用工厂模式实现[/quote] 工厂模式, 来个例子可以吗?例子: 一个未知值, 给据该值不同, 创建不同的类对象. 语言说一下也可以. 怎么不用if else[/quote] 建一个类 里面有个map<className, callbackFunction> 这样可以实现反射机制 如果你愿意可以用工厂模式包起来 不过一般人会用RTTI 但这样无法避免if else
jiht594 2015-03-24
  • 打赏
  • 举报
回复
引用 18 楼 bear234 的回复:
[quote=引用 14 楼 jiht594 的回复:] [quote=引用 11 楼 bear234 的回复:] 楼主你需要学习 设计模式 设计模式有很多 但原则只有一个:度 通过增加类的关联的复杂程, 避免 if else switch case 的使用
还有你这个原则是哪个大神总结出来的? 设计模式的原则竟然是 "避免 if else switch case 的使用" 我用屁股想, 都知道不对.[/quote] " 通过增加类的关联的复杂程度, 避免 if else switch case 的使用" ------- 这是我说的 设计模式原则: 开闭原则 里氏代换原则 依赖倒转原则 接口隔离原则 合成/聚合复用 最少知识原则 你可以去看这些原则反例, 全部都是很多if else 代码耦合程度高的直接表现, 就是if else 的大量使用 从理论上讲, 设计模式可以100%避免 if else 但代价就是 class 结构复杂化 因此并不是所有的if else 全部用设计模式替换掉才是正确的 只有对于那些耦合程度高同时又会经常增删改的模块 才应该考虑使用设计模式 所以, "一个未知值, 给据该值不同, 创建不同的类对象."-----这种情况一般就直接用if else switch 了 但楼主的情况:" switch 有太多了,如果 达到 100 多个" 必须使用设计模式 [/quote] 那我就请教 "一个未知值, 给据该值不同, 创建不同的10000个类的对象.", 怎么消除 if else. 只要解决这个问题, 我就消失. 我真的是非常希望你能给出答案.
bear234 2015-03-24
  • 打赏
  • 举报
回复
引用 14 楼 jiht594 的回复:
[quote=引用 11 楼 bear234 的回复:] 楼主你需要学习 设计模式 设计模式有很多 但原则只有一个:度 通过增加类的关联的复杂程, 避免 if else switch case 的使用
还有你这个原则是哪个大神总结出来的? 设计模式的原则竟然是 "避免 if else switch case 的使用" 我用屁股想, 都知道不对.[/quote] " 通过增加类的关联的复杂程度, 避免 if else switch case 的使用" ------- 这是我说的 设计模式原则: 开闭原则 里氏代换原则 依赖倒转原则 接口隔离原则 合成/聚合复用 最少知识原则 你可以去看这些原则反例, 全部都是很多if else 代码耦合程度高的直接表现, 就是if else 的大量使用 从理论上讲, 设计模式可以100%避免 if else 但代价就是 class 结构复杂化 因此并不是所有的if else 全部用设计模式替换掉才是正确的 只有对于那些耦合程度高同时又会经常增删改的模块 才应该考虑使用设计模式 所以, "一个未知值, 给据该值不同, 创建不同的类对象."-----这种情况一般就直接用if else switch 了 但楼主的情况:" switch 有太多了,如果 达到 100 多个" 必须使用设计模式
加载更多回复(15)

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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