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

2014-08-14 02:14:11 +08:00
 raincious
你竟然点进来了,难以置信呢……

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

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

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

Event.h
https://gist.github.com/raincious/b35768fae1a9902f3985

Event.cpp
https://gist.github.com/raincious/0da2233de7daebd4c966

好了,错在哪儿呢:
https://gist.github.com/raincious/79ca39658890a4b992c3

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

谢谢;
1499 次点击
所在节点    C
14 条回复
orzfly
2014-08-14 02:28:48 +08:00
zonyitoo
2014-08-14 04:50:00 +08:00
看样子是因为名字太长,被截断了
nybux
2014-08-14 08:35:09 +08:00
1.在Event.cpp的12和13行之间插入
Events Listener::events
2.Event.h的最前面添加
#pragma warning (disable:4503)
raincious
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
2014-08-14 10:50:23 +08:00
路过。还在拨弄函数指针啊,楼主为什么不用boost库呢?
人生苦短,我用boost
raincious
2014-08-14 10:56:47 +08:00
@abscon 嗯……因为我觉得有点杀猪牛刀的感觉。这程序功能很小的,所以不用那么复杂。而且……我也是纯粹折腾下C++而已。
tmqhliu
2014-08-14 10:59:13 +08:00
别用函数指针了, 用C++的实现方式吧, C++11 里有 std::function 以及 lambda 以及 auto 和 decltype
raincious
2014-08-14 11:04:07 +08:00
@tmqhliu 别劝我了,这是个DLL……,而且我得按照主项目的功能定义来实现。主项目提供的SDK指定了VS2013,而我根本不知道怎么转换成其他版本的……
abscon
2014-08-14 11:27:42 +08:00
@raincious 正因为你的程序功能小,所以更应该别发明轮子了。感觉对小程序还亲自写底层的代码才是用牛刀呢。

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

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

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

好了……我接下来再试吧,这个项目就先这样了。
ioth
2014-08-14 14:56:37 +08:00
好好玩。
mathgl
2014-08-14 19:41:14 +08:00
@raincious 说服他们用c++11
bombless
2014-08-15 09:49:12 +08:00
VS2013上用std::bind和std::function挺爽的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/127783

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX