免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cppfans6
打印 上一主题 下一主题

C++真好,努力学习中。。。。。。 [复制链接]

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
11 [报告]
发表于 2011-09-08 17:03 |只看该作者
本帖最后由 captivated 于 2011-09-08 17:04 编辑

回复 9# 幻の上帝

    ... 委托?... 拜托,委托不就是函数指针么。C#因为没有函数指针这种东西才抽象出来个以类对象代表函数的东西。C++里面爱玩函数指针就玩函数指针,爱玩函数对象就玩函数对象(重载了"()"的对象)... 说“委托”是神马新机制的,我真的忍不住好笑。

    垃圾回收?... RAII是干嘛的啊,RAII还是确定性析构。又不是只有内存资源是资源,数据库链接、打开的文件也是资源,RAII能管理,gc能管理不?

    至于反射... RTTI在C++中本来就不是推荐使用的东西。我知道反射比RTTI看上去更强大那么一点,但是实际上有更好/更多的设计方案,比如模板。你非要在运行时去探知某个类并使用它是吧?C++也不是办不到,只不过要多费点手脚,去了解MFC中的DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC如何实现的吧~

    要玩新华样... C# Java之流至今没超越C++. 尤其Java的单继承、多接口实现的烂设计,OW已经说过了,这是缺陷而不是优点。

评分

参与人数 1可用积分 +2 收起 理由
OwnWaterloo + 2 google "delegate async"

查看全部评分

论坛徽章:
0
12 [报告]
发表于 2011-09-08 18:24 |只看该作者
回复  幻の上帝

    ... 委托?... 拜托,委托不就是函数指针么。C#因为没有函数指针这种东西才抽象出来 ...
captivated 发表于 2011-09-08 17:03



“委托不就是函数指针么?”
——拜托,请不要随意把已有的明确概念给override掉,函数指针是什么应该都清楚,委托不是函数指针,尽管它们干的活类似
“垃圾回收?垃圾回收?... RAII是干嘛的啊,RAII还是确定性析构。又不是只有内存资源是资源,数据库链接、打开的文件也是资源,RAII能管理,gc能管理不?”
——仅仅是说垃圾回收也C++做得到而已,并没说资源管理就应该使用垃圾回收。说实话没什么变态的需求我可不想碰GC。

“至于反射... RTTI在C++中本来就不是推荐使用的东西。我知道反射比RTTI看上去更强大那么一点,但是实际上有更好/更多的设计方案,比如模板。”
——你能断定模版在任何情况下比运行时类型判断好么?非有运行时才能知道能塞进类型系统里处理的东西肿么办?何况语言特性的组合本身就有局限性。比如virtual member template?不过这方面最大的无能是实现的二进制兼容性问题,和语言本身没啥直接关系(要说有关系也只是对实现限制得太少了)。

论坛徽章:
0
13 [报告]
发表于 2011-09-08 18:27 |只看该作者
不过在这里喷Java、C#之类没MI是你好我好大家好。双手赞成。

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
14 [报告]
发表于 2011-09-08 19:01 |只看该作者
本帖最后由 zhujiang73 于 2011-09-08 19:09 编辑
回复  幻の上帝

    ... 委托?... 拜托,委托不就是函数指针么。C#因为没有函数指针这种东西才抽象出来 ...
captivated 发表于 2011-09-08 17:03



    反射没用,看看我们的 GTK 做了什么,尽管代价大了点。

“It makes sense to build many kinds of applications using (at least) two different levels and languages. Those being C+GObject, and a managed (GC'd) runtime. C is good for graphics, multimedia, and lower level systems work. However, writing complex software is difficult and error-prone without garbage collection. A managed runtime such as Vala, JavaScript, Python, Java, Lua, .NET, Scheme etc. makes a lot of sense for non-fast-path application logic such as configuration, layout, dialogs, etc.

Thus, one of the major goals of the GObject introspection project is to be a convenient bridge between these two worlds, and allow you to choose the right tool for the job, rather than being limited inside one or the other. With the introspection project, you can write for example a ClutterActor or GtkWidget subclass in C, and then without any additional work use that class inside JavaScript.”   


   关于“委托”,话就更长了,参见:成员函数指针与高性能的C++委托 http://www.cnblogs.com/jans2002/archive/2006/10/13/528160.html


  对了 int pthread_create(pthread_t *restrict tidp,
                   const pthread_attr_t *restrict attr,
                   void *(*start_rtn)(void),
                   void *restrict arg);

  如果  void *(*start_rtn)(void) 是一个委托,C++ 的线程世界就清净了。

评分

参与人数 1可用积分 -1 收起 理由
OwnWaterloo -1 原来线程的难点是传递arg……

查看全部评分

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
15 [报告]
发表于 2011-09-08 19:24 |只看该作者
回复 14# zhujiang73


    "原来线程的难点是传递arg……可用积分 -1" ,arg 不是问题,问题是如果我要在线程里运行一个成员函数那,不行了么,把我的分还我。

论坛徽章:
0
16 [报告]
发表于 2011-09-08 20:36 |只看该作者
托管和反射到底是什么东西,哪位大牛能形象地解释一下么?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
17 [报告]
发表于 2011-09-08 20:41 |只看该作者
本帖最后由 OwnWaterloo 于 2011-09-08 20:42 编辑

回复 15# zhujiang73

原来你纠结的是成员函数……   arg都传过去了,调用成员函数还能难住你了? 果然面向对象会降低人的智商……

  1. void* f(void* arg) {
  2.     X* x = static_cast<X*>(arg);
  3.     void* y = x->f();
  4.     delete x;
  5.     return y;
  6. }

  7. pthread_create(..., f, new X(...), ... );
复制代码
我以为困惑你的是:
1. 如何(简便地)将多个参数压缩到一个参数

  1. // tuple与any的具体使用方式可能有误……
  2. void* f(int i, double d) { ... }
  3. void* f(void* arg) {
  4.     auto a = static_cast<any*>(arg);
  5.     auto x = any_cast<tuple<int,double> >(*a);
  6.     delete a;
  7.     return f(x[0],x[1]);
  8. }
  9. pthread_create(..., f, new any(make_tuple(12,3.26)), ... )
复制代码
2. 对这种签名 int bad_pthread_create(void* (*f)(void) );
实际上你在上面那一楼里面的typo才真正体现传递arg是个难题

pthread_create(或者win32下的一堆)没有传递arg的问题。

3. 再或者,是觉得写这种转发函数麻烦
敢用boost(或者C++0x已经标准化?)吗?


综上, 分就不还你了……

论坛徽章:
0
18 [报告]
发表于 2011-09-08 20:43 |只看该作者

论坛徽章:
0
19 [报告]
发表于 2011-09-08 20:53 |只看该作者
回复  zhujiang73

原来你纠结的是成员函数……   arg都传过去了,调用成员函数还能难住你了? 果然面向对象会降低人的智商...
OwnWaterloo 发表于 2011-09-08 20:41


“面向对象会降低人的智商”何以见得?你这话可骂了所有软件牛人呀 {:3_182:}

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

将调用参数化方面,没有C#的delegate能做到而C++0x(或C++03+boost)做不到的功能。
顺便提一下, delegate可以将调用异步。 这才是C++0x+标准库下没有提供的功能。
要实现至少需要线程与序列化方面的库, C++0x带了前者没有后者。
C#语言脱离了.net也没什么特色。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP