22 | 知识串讲(下):带你开发一个书店应用
该思维导图由 AI 生成,仅供参考
数据定义
- 深入了解
- 翻译
- 解释
- 总结
本文详细介绍了开发书店应用的主要业务逻辑,包括数据表示与统计、数据接收和发送主循环等内容。通过对SalesData类和Summary类的设计和实现,读者可以了解如何应用C++编码准则和选择合适的数据结构来开发书店应用的核心业务逻辑。文章还介绍了服务端主线程和数据外发线程的实现,包括使用lambda表达式和智能指针来处理数据接收和发送,以及使用HTTP协议将数据发送到后台的RESTful服务器。作者强调了在编写类时应用关键字和细节来提高效率和安全性,选择合适的序列化格式和容器,以及注意捕获变量的生命周期和异常处理。总体而言,本文展示了如何利用C++特性实现多线程、高性能的服务端程序,并提供了一些实践性的课下作业,帮助读者巩固所学知识。
《罗剑锋的 C++ 实战笔记》,新⼈⾸单¥59
全部留言(17)
- 最新
- 精选
- robonix代码里显式声明了转移构造和转移赋值函数,这样,在放入容器的时候就避免了拷贝,能提高运行效率。 那么被转移的类会被掏空了,使得内部数据无效吗?
作者回复: 需要理解转移语义,它的目的就是要把原对象的内容给“偷走”,转移到新的对象里。 这样原对象就空了,但数据依然是有效的,比如0、nullptr,只是没有了实际意义,可以被安全、轻量地销毁。
2020-06-284 - wine99老师课外小贴士中说的“使用了泛型的lambda”,是指lambda的入口参数用了auto吗?
作者回复: 是的,泛型的lambda就是以auto作为参数类型,让编译器来推导类型。
2021-10-033 - robonix老师,还想问一下,为啥不用std::lock_guard,自己写一个lock呢,只为了性能嘛?
作者回复: 示例代码,当然都是自己写出来比较好了,可以实践一下编码准则。
2020-06-283 - Geek_6427cc老师您好,想向您请教下,HTTP 服务器地址URL中的token参数有什么作用,在您编写的Lua模块中,判断了这个token参数,不是很理解
作者回复: 这个token就是一个非常简单的鉴权认证,如果token里不是字符串cpp@2020,就直接返回403,可以防止其他应用误入这个uri。 如果接触过api网关、restful调用,可能就会理解它的作用了。
2021-09-0722 - Geek_8866d4SalesData(SalesData&& s) noexcept 罗老师, 你这个引用的引用怎么理解呢,我的c++语言功底比较薄弱,您的这个代码我很多都不是很理解
作者回复: &&表示右值引用,意思是对象是临时的,可以被move优化。 这个函数是C++11引入的转移构造函数,构造的时候可以把函数参数s里的东西都给“偷”到自己内部,降低对象创建的成本。 C++里的概念很多,如果遇到暂时不了解的也不要着急,说明你可能暂时用不上,探索其他更有用的地方,不要为一两个小特性分心。 有其他不明白的可以再问。
2021-04-182 - 有学识的兔子1、Thread生成的地方,没有去做异常检查,我不太确定需不需要? 2、假如使用python脚本去简化客户端测试,是不是通过PYBIND11的方式把Client.cpp里的接口转化成python能够加载模块,在利用python测试该模块? 3.可以将SalesData里面涉及pack和upack的部分拆分出来,用工厂方法进行替换;工厂类可以借用STL将不同类型数据格式和对应工厂类映射起来;在通过配置文件增加该类型的配置,解析到数据类型后,关联到对应的工厂类产生对应的对象,基于此来动态切换实现pack和unpack的数据格式。
作者回复: 1.只要没有显式声明noexcept的地方,其实都应该加上try-catch。 2.对,用C++写底层接口,然后用Python、lua去调用。 3.思路很对。
2020-06-262 - 忧天小鸡代码全都看得懂,但我不是服务端啊,这个怎么运行起来,缺少这方面的知识,怎么办?
作者回复: 用g++编译生成可执行文件,源码里有注释可以参考。
2021-12-171 - 阿辉recv_cycle的for循环的目的是什么?为啥,我运行完成程序,这个for循环只在client执行的时候会执行!因为我打了日志,只有client执行后,才会输出相应日志!
作者回复: recv_cycle是服务主循环,首先阻塞在监听端口,有请求过来后才能走后面的流程处理数据。 参考一下代码里的注释,或者看看其他服务器的代码,应该就能理解了。
2021-07-111 - 木瓜777每次接受请求,都开启一个线程,是否合理?
作者回复: 每个请求开新线程的代价是比较高的,但课程里的代码只是为了演示目的,实际项目里最好用线程池。
2020-06-2521 - 起床君补充2个点: 1. ZmqContext里的静态成员函数:zmq_socket_type send_sock(int hwm = 1000, int linger = 10),client端如果用这个函数做发送,建议把linger值设大一点,或者直接设为-1,这样客户端不会因为立刻关闭,而丢失掉mq中的消息;否则由于没有报错,服务端收不到消息也不好排查~ 2. SalesData中的成员变量m_revenue,看意思应该是想设为double类型(using currency_type = double;),虽然实际中也不会用double,不过也算是个小typo啦~
作者回复: good
2023-09-14归属地:新加坡