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

一个习惯 PHP 的来弄 C++简直就是自虐啊:求往 vector 储存&传递函数地址指针,并取出、执行的正确方式。

  •  
  •   raincious · 2014-08-14 02:14:11 +08:00 · 1531 次点击
    这是一个创建于 3763 天前的主题,其中的信息可能已经有所发展或是发生改变。
    你竟然点进来了,难以置信呢……

    好吧,问题是这样的:
    有一个程序,会从一个API上取得点数据,这些数据在一个map里。然后Map里面有一个记录(Type),我需要通过这个Type来调用不同的函数来进行操作。

    当然,我知道switch,嗯,但是我希望能更灵活点,有点CI的意思。于是想到用一个map套一个vector。map的first是与Type对应的值,second是vector,而vector里面就是函数的指针,通过这个指针来呼叫函数。

    好吧,下面是实现的代码(当然,这是有Bug的,不然也不来问了不是):

    Event.h


    Event.cpp


    好了,错在哪儿呢:


    1、那个连接器错误我一直没办法解决;
    2、EventHandlers这个超长是咋回事?
    3、嗯……我上面的代码怎么才能无错编译通过?(VS 2013 Express)

    谢谢;
    14 条回复    2014-08-15 09:49:12 +08:00
    orzfly
        1
    orzfly  
       2014-08-14 02:28:48 +08:00   ❤️ 1
    zonyitoo
        2
    zonyitoo  
       2014-08-14 04:50:00 +08:00
    看样子是因为名字太长,被截断了
    nybux
        3
    nybux  
       2014-08-14 08:35:09 +08:00   ❤️ 1
    1.在Event.cpp的12和13行之间插入
    Events Listener::events
    2.Event.h的最前面添加
    #pragma warning (disable:4503)
    raincious
        4
    raincious  
    OP
       2014-08-14 10:48:59 +08:00
    @nybux

    1、好吧,真的fix了。为什么我昨天晚上加来加去不行呢……

    想想看貌似我搞成了Listener::Events events;,定义了一个本地类型,怪不得不行还一个劲的报Events不可访问(唔脸)……看来还是不能太晚睡了……

    2、@orzfly 好吧,我之前其实改成了这样:

    typedef vector <EventCallback> EventHandlers;

    typedef struct EventHandler {
    [空格]EventHandlers Handlers;
    };

    但是死活报堆空间不足,死活报堆空间不足,死活报堆空间不足。今天一查堆空间不足咋回事:

    2.Increase the size of the Windows swap-file.

    呵呵。

    那貌似就没问题了,就是不知道代码里是不是有Bug。

    谢谢各位。
    abscon
        5
    abscon  
       2014-08-14 10:50:23 +08:00
    路过。还在拨弄函数指针啊,楼主为什么不用boost库呢?
    人生苦短,我用boost
    raincious
        6
    raincious  
    OP
       2014-08-14 10:56:47 +08:00
    @abscon 嗯……因为我觉得有点杀猪牛刀的感觉。这程序功能很小的,所以不用那么复杂。而且……我也是纯粹折腾下C++而已。
    tmqhliu
        7
    tmqhliu  
       2014-08-14 10:59:13 +08:00
    别用函数指针了, 用C++的实现方式吧, C++11 里有 std::function 以及 lambda 以及 auto 和 decltype
    raincious
        8
    raincious  
    OP
       2014-08-14 11:04:07 +08:00
    @tmqhliu 别劝我了,这是个DLL……,而且我得按照主项目的功能定义来实现。主项目提供的SDK指定了VS2013,而我根本不知道怎么转换成其他版本的……
    abscon
        9
    abscon  
       2014-08-14 11:27:42 +08:00
    @raincious 正因为你的程序功能小,所以更应该别发明轮子了。感觉对小程序还亲自写底层的代码才是用牛刀呢。

    另外,VS2013已经支持C++11的不少特性了。

    s/猪/鸡用
    tmqhliu
        10
    tmqhliu  
       2014-08-14 11:48:06 +08:00
    @raincious C++11 是指C++语言的版本不是VS的版本,你用VS2013的话支持C++11毫无压力啊,这些新特性异常地好用你还折腾什么函数指针啊
    raincious
        11
    raincious  
    OP
       2014-08-14 12:05:47 +08:00
    @tmqhliu 不,我的意思是主项目不是C++11的,用了C++11说不定会遇到什么问题(比如不能编译之类的)。而且代码进仓库之后其他人也不一定愿意用C++11来编译。

    另外,VS2013里面我尝试了下std::function,没有……

    好了……我接下来再试吧,这个项目就先这样了。
    ioth
        12
    ioth  
       2014-08-14 14:56:37 +08:00
    好好玩。
    mathgl
        13
    mathgl  
       2014-08-14 19:41:14 +08:00
    @raincious 说服他们用c++11
    bombless
        14
    bombless  
       2014-08-15 09:49:12 +08:00
    VS2013上用std::bind和std::function挺爽的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5566 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 08:02 · PVG 16:02 · LAX 00:02 · JFK 03:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.