免费注册 查看新帖 |

Chinaunix

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

[C] 我决定将C++当做带Class的C来用~~ [复制链接]

论坛徽章:
0
91 [报告]
发表于 2014-07-11 01:23 |只看该作者
                              

论坛徽章:
0
92 [报告]
发表于 2014-07-19 23:06 |只看该作者
template 和操作符重载是C++最具威力的特性,当然,不用也能完成任务,但要多写很多代码

论坛徽章:
0
93 [报告]
发表于 2014-08-07 15:12 |只看该作者
都out了,Swift才是大势所趋

论坛徽章:
0
94 [报告]
发表于 2014-08-14 09:24 |只看该作者
方法全静态,全public?

论坛徽章:
0
95 [报告]
发表于 2014-09-01 01:09 |只看该作者
其实用c++的很少吧,也理解不到多深吧。类用起来跟struct差不多,没发挥多少OO的特性。

论坛徽章:
0
96 [报告]
发表于 2014-09-13 14:14 |只看该作者
C++除了STL是一个不错的工具,其他的任何一个特性都和代码的简洁没关系!
C如果有这么好的库,分分钟不做C++

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
97 [报告]
发表于 2014-09-16 11:10 |只看该作者
polyzz 发表于 2014-09-13 14:14
C++除了STL是一个不错的工具,其他的任何一个特性都和代码的简洁没关系!
C如果有这么好的库,分分钟不做C ...

有CSTL,本坛搜一下。

论坛徽章:
0
98 [报告]
发表于 2014-11-20 17:32 |只看该作者
这也是业界的现状,很多java程序员也就是一个main到底的,其实main是用来做单元测试的。
用好C++,需要的不是C++的语法,而是设计类的能力,你需要解耦,而不是一团东西堆在一起。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
99 [报告]
发表于 2014-11-20 17:58 |只看该作者
windoze 发表于 2014-05-29 16:37
回复 7# hellioncu

this和虚函数没什么直接关系,随便哪个成员函数都有this可用的。
虚函数最讨厌的地方就是只有指针/引用才有多态性,一旦你的程序开始使用虚函数,接下来你就甩不掉new/delete/*_cast这些东西了,而这些东西刚好就是很多人不喜欢C++的根本原因之一。


这个可是不一定的,你完全可以用静多态,没有 new/delete 这种问题,很多库就是用 CRTP 的

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
100 [报告]
发表于 2014-11-20 18:19 |只看该作者
幻の上帝 发表于 2014-06-23 10:39
回复 43# windoze

只要放弃C++继承跟OOD出来的继承一一对应的想法实际上问题就没那么大了。
为什么这里需要排斥继承呢。继承当mixin用不是很自然的手法么。
当然,要说C++在这里能力不足倒是对的。
成员的话得要一些不太好看的小花招。
template<class T>
class TextBoxTraits
{
public:
  using Event = decltype(Txxx);
  using EventMemberGetterType = some_getter_type; // 比如Event()。

private:
  EventMemberGetterType p;

public:
  template<typename T>
  TextBoxTraits(EventMemberPtrType f) : p(f)
  {}
  Event& GetEvent()
  {
  //  return (static_cast<T&>(*this).*p)();
  // 这里按 EventMemberGetterType 具体类型看着办。
  }
};
class Container : TextBoxTraits<Container >
{
public:
//...
};

只有一个事件比较浪费,多了还算能用。
不过我不用这套。为了接口清楚我宁可自己抄一遍类似的声明。就算mixin也是protected然后手动显式using。
如果怕麻烦罗嗦,用宏节约实现成本。


话说这里为什么要保存 event_handler 的一个拷贝呢?
要么直接在  container 里边定义

  1. template< typename D >
  2. struct TextBox
  3. {
  4.     void on_enter_pressed()
  5.     {
  6.        D& self = static_cast<D&>( *this );
  7.        self.process_enter();
  8.     }
  9.     void process_enter()
  10.     {
  11.         std::cout << "I am default enter handler";
  12.     }
  13. };

  14. struct my_text_box : TextBox<my_text_box>
  15. {
  16.     void precess_enter()
  17.     {
  18.         std::cout << "ding?";
  19.     }
  20. };
复制代码
要么直接保存一个 map ,需要定制的时候直接修改就行了

  1. std::map<event_as_key_type, handler_function_type> event_handler_associate_map;
  2. event_hadler_associate_map[convert_event_to_key( enter_pressed_event )] = [](){ std::cout << "ding"; };
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP