V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
302790951
V2EX  ›  编程

C++怎么动态调用类?

  •  
  •   302790951 · 2014-12-18 00:24:18 +08:00 via iPad · 3330 次点击
    这是一个创建于 3629 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如我实力化了 aa bb

    当输入aa时调用aa实例
    当输入bb时调用bb实例

    求解 感谢!
    7 条回复    2014-12-18 13:47:15 +08:00
    messyidea
        1
    messyidea  
       2014-12-18 00:39:20 +08:00 via Android
    你说的是多态么。写一个虚类,然后aa和bb分别继承它,实现虚类的接口。
    302790951
        2
    302790951  
    OP
       2014-12-18 01:07:15 +08:00 via iPad
    @messyidea 不是这样的,比如写一个shop类,里面各种商品属性,然后实例化shop apple,shop orange,我想可以用户输入apple类调用apple的属性,输入orange调用orange的属性
    jybox
        3
    jybox  
       2014-12-18 01:40:10 +08:00
    把名字和指针存到一个 map 里,根据用户输入来调用相应指针。
    想在运行时反射变量名,虽然也许可以做到,但在 C++ 里肯定不算优雅。
    当然,其实大部分 C++ 代码也没啥优雅可言 ...
    302790951
        4
    302790951  
    OP
       2014-12-18 08:09:23 +08:00 via iPad
    @jybox 感谢!能帮忙写一个例子吗?谢谢
    sqbing
        5
    sqbing  
       2014-12-18 10:07:34 +08:00
    这种做法一般不提倡。
    一定需要这么用,要么你选错了C++,要么设计有问题……
    @jybox 的方法可行的前提是,枚举所以shop类的子类。
    fliar
        6
    fliar  
       2014-12-18 10:39:29 +08:00
    表達要講很多,直接寫偽代碼
    class A : public Base { public static const char * = "a"; public static Base* Make(){return new A()};}
    class B : public Base { public static const char * = "b"; public static Base* Make(){return new B()};}
    那麼你需要一個map來保存所有類的Make,這樣你就可以*map["a“]()來創建類
    接下來你一定會想我怎麼自動把Make註冊進map
    利用global是可行的,但是有局限性,在靜態庫中global就不能勝任
    簡單說,完全自動註冊Make的方法,直接用代碼寫,我不敢說沒有,但是我想很難

    反射算是複雜功能,c++標準一直都沒有加進去
    heighgun
        7
    heighgun  
       2014-12-18 13:47:15 +08:00
    通常来说不要用反射的思想来写代码况且C++也没有反射,推荐的方法是@messyidea说的那样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2710 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 10:25 · PVG 18:25 · LAX 02:25 · JFK 05:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.