21 | 知识串讲(上):带你开发一个书店应用
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
本文以C++知识串讲为主题,通过回顾前面所学的C++知识,介绍了概论、语言特性、标准库和技能进阶等四大模块的内容。作者以开发一个书店应用为例,详细讲解了C++程序的实际开发过程,包括项目设计、核心头文件的定义以及自旋锁的实现。文章突出了C++的特性和技术要点,涵盖了C++的现代特性、多线程编程、设计模式和设计原则等内容,为读者提供了一个全面的C++知识学习和实践的指南。文章还介绍了网络通信和配置文件解析的实现细节,展示了作者对于C++技术的深入理解和实际运用。通过对需求分析、设计模式和设计原则的应用,以及对C++特性的恰当使用,读者可以获得对C++编程的深入理解和实践经验。文章内容丰富,涵盖了C++编程的多个方面,对于想要系统学习和实践C++编程的读者来说,是一篇非常有价值的文章。
《罗剑锋的 C++ 实战笔记》,新⼈⾸单¥59
全部留言(17)
- 最新
- 精选
- yadandan老师您好,“这样就绕过了 C++ 的语言限制,不必在实现文件“*.cpp”里再写一遍变量定义,全部的代码都可以集中在 hpp 头文件里”,这句话怎么理解,能举个例子吗?
作者回复: C++要求静态成员变量必须在cpp文件里定义实现,头文件里只是声明。 而在静态成员函数里声明静态变量,再以函数返回值的形式来使用,就不需要在cpp里重复写一遍,只要在头文件里写就行了。 课程的示例代码就是这样的,你也可以自己模仿着试一下,用静态成员函数代替静态成员变量。
2020-06-26315 - reverse关于UML图 想学的同学可以看一下《UML大象》
作者回复: uml其实并不难,也没有必要完全学通学精,本质上就是个画图。 先学会最基本的类图、时序图,其他的可以在实践中慢慢学。
2020-06-23210 - K. D.老师你好,我上网查了一下spin lock(自旋锁)和mutex(互斥锁)的区别,自旋锁是会让线程busy waiting,而互斥锁则是让线程sleep,从cpu的占用角度,是否sleep是更好的?busy waiting感觉更加cpu intensive。
作者回复: 你理解的很对,两者的区别就在这里,自旋锁的好处是不会让出cpu,busy waiting,这在小等待时的代价就比较低,可以充分利用cpu。而mutex会让线程sleep,暂时让出cpu给其他线程,这就有点浪费。 具体该用哪个还是要看应用场景,在这里我用自旋锁只是为了演示atomic的用法。
2020-06-2437 - henry老师您好!ZmqContext 类中的两个工厂方法 recv_sock,send_sock, 返回值是zmq::socket_t的对象,里面的临时对象sock析构时不用担心zmq_close 关闭了_handle,是因为zmq::socket_t实现了移动构造函数,临时对象sock的_handle别转移了,自己的_handle已经是null_ptr了对吧。 要是我自己实现这个代码的话,估计还是会用智能指针的方式。时刻注意构造和析构细节感觉挺麻烦的。
作者回复: 是的,都看zmq.hpp的源码了,很认真啊。 有了右值和转移构造,在C++里返回对象确实省了很多力气。
2020-07-1721 - 泡泡龙老师能否说说需求到UML图的过程,是怎么把需求提到UML的。还有就是给一张UML图,应该怎么看?
作者回复: 1.这个就是基本的需求分析了,简单来说,就是提取出需求里的名词和动词,转化成相应的类,比如销售记录、配置文件、锁、XX主循环。 2.UML图有很多种,这里用到的是类图,表示的是类之间的关系,需要理解UML的基本语言要素,比如聚合、联系等,然后可以随便选一个类作为起点,像爬虫一样,沿着关系链接去看它相关的类,逐步去理解这些类是如何配合工作的。
2020-06-231 - 白这个SpinLockGuard只能等到作用域结束才能释放,如果我想提前释放要怎么做呢,例如rust中有drop函数,不知道c++中有没有相应的实现
作者回复: SpinLockGuard是自己的代码,可以为它再增加一个成员函数。
2024-02-21归属地:安徽 - Geek_1cd0c8老师请问下 ,1.书店程序文章内说是从不同地方收集数据汇到后端服务,当我运行客户端程序c.out,的时候没见到有数据收集的入口呀,2.开着openresty。服务端程序a.cout,第二次运行客户端程序c.out,服务器程序a.out直接崩了,hello cpp_study server 1 2 3 4 terminate called after throwing an instance of 'msgpack::v1::type_error' what(): std::bad_cast 已放弃 (核心已转储),有遇到这个问题吗
作者回复: 1. 客户端程序只是示意,直接在代码里写死了两条记录。 2.可以用gdb debug看看出错在哪里。
2023-01-29归属地:天津 - Geek_1cd0c8大哥们编译问题都能解决?编译时 crytypes.h文件 line:24 "std" has no member "string_view" 这需要c++17编译咋没人提 ,你们都用的c++14编译过的吗
作者回复: 是哪个库引用的string_view?是不是新版本库引用了C++17的这个组件,如果是GitHub项目里的应该用C++14肯定能过的。
2023-01-20归属地:天津 - 我是一只小小鸟老师,您好,有个问题请教下,只使用.hpp,如果函数接口比较多,易读性怎么保证。到时候一个hpp文件,会不会出现1000+
作者回复: 其实这个和hpp没有必然关系,用.h + .cpp也会有同样的问题,只要类设计合理,用好设计模式,不要出现面条类,一两千行的源文件也是可以接受的,如果再大就要考虑重构了。
2022-09-05归属地:北京 - Geek_6427cc老师您好,get模板函数的返回值不是很懂,不明白LuaRef_cast是什么,类型转换不是只有那四个方法吗
作者回复: LuaRef_cast是lua bridge自己的类型转换函数,把lua数据转换C++数据。
2021-08-162