xiaozongpeng 发表于 2023-1-4 20:05

学习完 C++ Primer 能做什么项目练手或者看什么好的开源 ...

很着急找点好的源码看和好的项目练手,怕不用很容易忘啊!

franciscochonge 发表于 2023-1-4 20:11

这个问题必须强行答一波!!
各位实习/校招走C++后台开发还在找项目的同学看过来!!
我是去年本科拿到 BAT等 大厂offer,也是 C++ 后台开发方向。
今年指导过好几个学弟拿到 C++ 后台开发大厂offer。

我真的是幕了!! 他们好几个都 40w +,今年太香了!

看完这个回答,相信一定对你也有用。

首先,学完 C++ Primer 是哪种学完?
有做那些练习题吗?还是说只是像看小说一样看完了。
另外,相信看到这个问题一定是一些刚学C++不久的同学
其它答主提到的如 Google Chrommium之类好是好,但是不适合初学者! 大家别被误导了!!
大家都说学 Java 可以写各种后台服务,但是 C++ 除了 Web Server 都不知道写什么。
在这里,我给大家一些提供一些 C++ 项目的思路:

[*]游戏,比如贪吃蛇、五子棋、坦克大战,是不是觉得很简单?给大一做的?那你可以单机的基础上,加入网络编程,去做一个联机的游戏,在这个过程你会涉及到网络编程、序列化、反序列化、协议制定、状态同步等知识!
[*]TinySTL,也就是去模仿实现 STL 各种类库,比如 Vector、Map这些,从源码去理解 STL
[*]网络库、网络编程,可以去写网络库,参考 muduo,或者 WebServer ,Redis Client、RPC、FTP 等和网络编程相关的
[*]写一些库,比如 json、xml解析库、加解密、压缩解压缩等等这种小工具、类库,不仅能锻炼 C++ 编程,还能提高一些类似编译原理、密码学方向的知识。
初学者一定要注意编程能力是写出来的,不管你去写啥,只要不断的写,你就会感觉到编程能力的提升。
编程本质上还是一项技能,熟能生巧在这里一定是适用的。
当你写到1w、10w行、几十万行的时候,一定会感受到量变到质变,可以看看这个回答,相信对你也有启发:
你的编程能力从什么时候开始突飞猛进?
编程没有捷径可以走,一定是不断的练习。

在这里我给大家推荐几个学习 C++ 的开源项目,尤其适合校招同学,记得 @编程指北 点赞收藏呀!

一、webbench
Webbench是Radim Kolar在1997年写的一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。
非常适合用来学习网络编程,代码量也不大,适合初学者:
项目地址:http://home.tiscali.cz/~cz210552/webbench.html

二、Lightweight Web Server
听说今年人均一个web server??那这里也给大家推荐几个,都比较类似,核心用到的技术点和思想就是epoll、threadpool、one loop per thread、日志等。
这里推荐两个:
https://github.com/linyacool/WebServer (牛客大佬)
https://github.com/imarvinle/WebServer
主要特性如下:
状态机解析HTTP请求,目前支持 HTTP GET、HEAD方法

[*]添加定时器支持HTTP长连接,定时回调handler处理超时连接
[*]使用 priority queue 实现的最小堆结构管理定时器,使用标记删除,以支持惰性删除,提高性能
[*]使用epoll + 非阻塞IO + 边缘触发(ET) 实现高并发处理请求,使用Reactor编程模型
[*]epoll使用EPOLLONESHOT保证一个socket连接在任意时刻都只被一个线程处理
[*]使用线程池提高并发度,并降低频繁创建线程的开销
[*]同步互斥的介绍
[*]使用RAII手法封装互斥器(pthrea_mutex_t)、 条件变量(pthread_cond_t)等线程同步互斥机制,使用RAII管理文件描述符等资源
[*]使用shared_ptr、weak_ptr管理指针,防止内存泄漏
什么?你说不想卷WebServer?好咧,那咱们来点其它的轮子:
三、libjson
这是一个超级高效的JSON解析器,并且高度可定制的,非常轻巧。
主要特性:


[*]Lazy or aggressive JSON Parsing
[*]100% JSON compliant
[*]C++ interface
[*]Language independent C interface
地址:https://sourceforge.net/projects/libjson/
其它不错的json库: https://github.com/cesanta/frozen
好吧,你说也不想写json解析器,那咱们来看看key-value存储?
四、KV存储


[*]leveldb
这是一个基于LSM结构的KV存储,levldb常常被用作各类数据库、存储系统的存储引擎,估计在BAT都能找到它的使用。
设计思想值得学习,LevelDB是一个持久化存储的KV系统,和Redis这种基于内存的KV系统不同,LevelDB不会像Redis一样大量使用内存,而是将大部分数据落到磁盘上。LevleDB在存储数据时,是根据记录的key值有序存储的,就是说相邻的key值在存储文件中是依次顺序存储的,而应用可以自定义key大小比较函数,LevleDB会按照用户定义的比较函数依序存储这些记录。
地址:https://github.com/google/leveldb
还可以学习下RPC框架,目前使用C++做后台开发的语言的公司基本都有一套自己的微服务框架,所以可以尝试自己去写一个非常初级的rpc框架,学习下网络通信、序列化、服务注册、服务发现等知识,这里推荐几个,有非常成熟的,也有比较适合学习的:
五 RPC框架


[*]rest_rpc
这是它的简介:c++11, high performance, cross platform, easy to use rpc framework.
It's so easy to love RPC. Modern C++开发的RPC库就是这么简单好用!
是的,这是一个使用modern C++ 开发的rpc框架,rest_rpc为用户提供了非常简单易用的接口,几行代码就可以实现rpc通信了,来看个 :
这是一个加法服务,是不是很简单?




地址: https://github.com/qicosmos/rest_rpc
另外的一些成熟RPC框架:
百度:https://github.com/brpc
google:https://www.grpc.io
搜狗:https://github.com/sogou/workflow、https://github.com/sogou/srpc
srpc特性:



这些成熟的rpc框架可以去学习下设计思路和整体实现
六、序列化
RPC框架都会用到序列化框架,那这里也可以顺便学习下pb,看pb是如何做到高效、扩展性好的。
地址:https://github.com/protocolbuffers/protobuf/

七、MiniOS
这个其实更属于 C 语言,但是C++方向的也可以作为项目,典型的比如 xv6(mit 6.828)、哈工大 linux 0.11

八、手写 STL
可以看下这个github仓库,比较完善了:
https://github.com/Alinshans/MyTinySTL

在这,顺便送大家一份我整理的包含几十本经典 C/C++ 电子书大全合集:



获取方式可以看看这篇文章,附带了电子版的PDF下载链接,赶紧收藏起来吧:
C++ 必读书籍推荐
另外,看完 C++ Primer 只能算 C++入门级,还需要看很多书,写很多代码才能达到,熟练,在这也给大家一个学习路线吧:
C++入门路线
在这里也给初学的同学一份书单吧,慢慢啃~
1. 《C++ Primer》
这本书基本包括了 C++ 11 的全部特性,最好把前面三部分:C++基础、C++标准库、类设计者的工具都看一遍,我当时花了一个多月断断续续看到了第16章模板那里。
2. Effective 系列:《Effective C++》、《More Effective C++》、《Effective STL》
第一本是重点,光看《C++ Primer》缺少实践的话,大概率还写不出合格的 C++ 代码,而《Effective C++》就是通过 55 条非常具体的做法告诉你什么样才是符合 C++ 编码规范的,可以缩短你写出合格 C++ 代码的时间,减少踩坑,强烈推荐必读,后面两本优先级稍低,可以有时间再读。
3. 《STL 源码剖析》和《深度探索 C++ 对象模型》
看完 Primer 和 Effective,你应该已经能够比较熟练的使用C++了,但是还缺少对 C++ 底层实现机制的认识。比如虚函数表、成员变量布局等,同时对于 STL 库可能也仅仅停留在使用上。
推荐的这两本可以分别完善你在 C++ 底层实现和 STL 源码、原理上的认识。
以上书籍同时建议和侯捷老师的视频配合服用,效果更佳。
直接在 B 站搜索「候捷 C++」即可,主要有以下几个系列:


[*]《C++内存管理》
[*]《STL源码分析》
[*]《C++ STL与泛型编程高级》
[*]《C++11 新特性》
侯捷 C++ 视频课程一直都被看过的同学广为推荐,最近发现 B 站关于侯捷老师的 C++ 视频课程几乎全部被下架了,于是自己搜集了一套非常全的视频,大家赶紧去下载保存备用:
侯捷C++全套视频|含下载方式
到这里,C++基本入门了,,,后面修行就靠个人了哈哈哈

然后,还有些同学想学习网络编程,这里推荐几本书,挺不错的:
Linux 下网络编程核心的包括网络 IO 和系统编程两个部分:


[*]进程间通信方式: 信号量、管道、共享内存、socket 等
[*]五大 IO 模型:同步、异步、阻塞、非阻塞、信号驱动
[*]高性能 IO 两种模式:Reactor 和 Proactor( 但是 Linux 下由于缺少异步 IO 支持,基本没有 Proactor
[*]多线程编程:互斥锁、条件变量、读写锁、线程池等
[*]IO 复用机制:epoll、select、poll(破解 C10K 问题的利器)
推荐的书:

[*]《Unix网络编程》
[*]《Unix环境高级编程》
[*]《Linux高性能服务器编程》
[*]《Linux多线程服务器端编程》
觉得不错的话,可以关注我, 帮我 @编程指北 点个赞哟,让知识分享给更多需要的同学~

fwalker 发表于 2023-1-4 20:19

我今年41岁了,今年为了把《c++ primer》里学的知识,更新到c++ 20版本,我都3个月没怎么登录知乎了,就是一直在研究新书,看看如何填补空白。这3个月我舍弃的东西太多了。想想满满都是泪水。
学完《c++ primer》相当于 c++11的皮毛。距离实战还差14,17,20,23呢。这些恐怕要通过实战来理解,每个新标准得需要1年的时间。
就面前来看c++11已经是被丢弃的状态。协程,concept,modules,ranges,已经是新的基调了。
移动语义,共享语义,lambda与std bind的恩怨纠葛,并行编程中的各种模型,在各大三方库中的落地的应用。
那么还可以看的书,就是《effective modern c++》《c++ move 语义》《c++ template 第二版》 2021年,今年会出很多c++20的书。 照着书来打就可以。
至于落地的项目,这个就很有意思了,显然用《游戏剧本该怎么写》的套路,再用《游戏设计模式编程》里讲的设计模式,来进行c++落地。 刻意地用 lambda来搞各种mapreduce,然后再使用《c++ template 第二版》里的技术,来做泛型。
那么,就目前来看,client和server游戏编程是主流,那么用c++11库写的muduo,就比较合适做一个c/S的桥梁。然后我们在on message 回调事件中,处理 消息机制。
我们在客户端里,用设计模式中的代理模式来做一个server proxy,在server中,做一个client proxy模板。 再在client中,用命令模式做一个命令行解析器,在server中,做一个门面模式的解释器。看起来就有点像搞一个自己的简单版本的rpc。这样框架都搭建起来了。
然后,我们就找一些 单机的小游戏。把每一个控制的函数做成命令行来控制,虽然他们本该是图形化里,点鼠标或者是用手柄,或者是按键盘上下左右来控制的。 这个时候,我们就面临一个问题,那就是把一个完整的流程做成协程,还是拆分成若干小函数,用于命令行式的交互?显然协程是同步的思想,异步来执行,所有的流程在一个协程里,看起来完整易于理解。拆分成若干回调函数则容易逻辑混乱。那么此时,就得拿起c++20的书来补完“cppcoro”库中写的内容。
为什么要完全使用命令行的方式来把单机游戏网络化呢?对,就是为了解耦。也就是说,当前的数据结构和算法,还有流程,设计模式和架构可以和任何图形库配合。说白了,最近比较火爆的老游戏翻新,如果当时做游戏解耦彻底,那么现在网络化重制,就是重新对接一下接口api即可。其他都不用管。
唉,就在我重新看完《c++ primer》3个月后的今天,我依然还在 为《仙剑98》的开源版sdlpal的数据解耦状态中。原版用的c语言写的,我用std variant 代替了union。 里面各种全局c式函数,全部都让我class化了。几乎是先把每个c文件先做成一个class,然后再不断地分出更多的class来,通过组合和继承的方式,这样控制起来更加得心应手。 为了让模板嵌套的class更好记,我改用using来代替typedef。为了连接更多的字符串,我特意又翻看了《c++函数式编程》学会里面的延时调用,用模板来嵌套生成组合链。顺便学会了模板可变参的分法。
如果还有童鞋对于C++学习还有疑问。这里我推荐下开课吧家的课程,里面的课程都很不错,而且质量非常高,对于小白很友好,还能领取项目题库资料,需要的同学点击下方链接,免费听一下他们家的试听课程
到此,我依然还在努力中,等下个月有大进展再来更新。

unityloverz 发表于 2023-1-4 20:26

这个必须强行答一波!!!
各位校招走C++开发岗的小伙伴看过来!!!
本人是21届哈工大机械硕士
走的是C++后台开发岗位,
今年秋招拿下10+offer
拿过字节 阿里 腾讯的约50w的sp

很多搞C++的小伙伴
包括曾经我自己
特别是后端方向的

或多或少都有过一个这样的疑惑
"搞C++到底可以写哪些项目呢?"

在项目这个问题上
对于像我一样的非科班生
首先应该摒弃掉一个思维上的"误区"

拿我们机械举例
我们的课题是机器人
机器人作为一个交叉学科

在课题项目上所用到的东西就像"一锅乱炖"
电路设计,运动控制,视觉算法,
机械结构,QT界面,PID优化
调参 ,维修 ,拧螺丝,搭硬件平台等等

这种类型的项目是会涉及到一些C++
比如用来写QT界面 调算法API 控制下位机等等

但是目前求职市场上的C++岗位以"后端技术栈 "为主
也就是企业那边希望你的项目里面涉及到的技术是
"数据库 操作系统 计算机网络等等那一套"
而不是
"调调算法API 写写QT界面 控制机器人那一套"

总而言之
如果你要找互联网的C++相关开发岗位
对于我们机械来说
课题所涉及到的项目最大的问题是
"广而不精不对口"

也就是说
虽然你可能会觉得
" 我在我的课题上投入了挺多工作量的
而且做的东西好像也挺复杂挺高端的啊
而且也涉及到了写代码啊 python啊 C++啊
面试官肯定会被我做的东西所吸引的吧 "

但实际上呢你做的再高端 付出的工作量再多
和企业那边的"需求是不对口的"
而且就算涉及到了一些编程的东西
也是一些"简单的CRUD 调调算法API完事"

就算你把这段经历写在简历上
面试管面试的时候也是大概率不会感兴趣的

别人需要的是 "C++后端开发"
如果你是做这种类型项目的话
可能投递机器人相关公司的开发岗位会好一点

如果你想找互联网相关的开发岗位
就得自己取挖掘渠道
寻找切合相关技术栈的项目去做了

那么到底对于C++技术栈的小伙伴
到底可以尝试哪些项目呢?


C++作为一门贴近底层的语言
不好像Java那样快速的搭建一个业务系统

整不出一些“好玩儿”的东西
只能写一些轮子类型的项目



于是在给小伙伴们分享一下
我在准备秋招的一年多时间里
所搜集到的那些具有可以拿来练手的C++项目

1.写一个Json库


链接:
https://github.com/miloyip/json-tutorial/blob/master/tutorial01/tutorial01.md
2.写一个红黑树

链接:
https://github.com/william-zk/RB_Tree
3.写一个STL

链接:
https://github.com/Alinshans/MyTinySTL
4.写一个NoSQL

链接:
https://www.lanqiao.cn/courses/1341

5.写一个高并发内存池

链接:
https://blog.csdn.net/qq_41562665/article/details/90546750

6.写一个线程库

链接:
https://github.com/Winnerhust/uthread

7.写一个网络库

链接:
https://github.com/chenshuaihao/NetServer
8.写一个服务器框架

链接:
https://www.bilibili.com/video/av53602631?from=search&seid=9029288577396826503

9.写一个WebServer

可以参考一些书
《Linux高性能服务器编程》
还有陈硕的那本书 等等
WebServer应该很多人都有做。。。

链接:
https://github.com/linyacool/WebServer

10.写一个操作系统内核

搜一下 “MIT 6.828”
感觉课程里的一个作业都可以拿来当做一个项目了
链接:
https://github.com/woai3c/MIT6.828全是压箱底的干货整理不容易求赞!!! 求转发!!!

RedZero9 发表于 2023-1-4 20:27

一、项目推荐

1. filezilla

filezilla 是一款开源的 FTP 软件,其源码下载地址如下:
链接: https://pan.baidu.com/s/1Efr8mEzRLgFqFvmRfX2z4Q 密码: rufj


2. uWebSocket 网络库

uWebSocket 是一款开源的 WebSocket 库,最新版使用了大量 C++17 的语法,美中不足的是这个库代码存在不少 bug,我在项目中使用了它,但修改了其大量的 bug,有兴趣的朋友也可以下载下来看一下:
下载地址:
https://github.com/uNetworking/uWebSockets3. TeamTalk

TeamTalk 是蘑菇街开源的一款用于企业内部的即时通信工具,其下载地址是:
https://github.com/balloonwj/TeamTalk







4. 我的开源 Flamingo IM

https://github.com/balloonwj/flamingo我用 C++ 编写了一个即时通讯软件 flamingo,目前有服务器端(Linux C++)、PC 端(Windows C++),当然如果你感兴趣的话还有安卓端和 IOS 端,github地址:baloonwj/flamingo,以下是部分截图。
Flamingo 学习视频
我知道的是一些同学通过学习此项目拿到了 Linux C/C++ 开发的 offer,为了帮助大家学习,我录制了 3 部高清讲解 Flamingo 的学习视频,下载链接:
链接: https://pan.baidu.com/s/1hdyXIyeVwkddXty4RzvCcg 密码: hv5v目前即时通讯软件实现了如下功能(这里只列举网络相关的功能,其他客户端已经实现的功能不统计在列,请自行发现):

[*]注册
[*]登录
[*]查找好友、查找群
[*]添加好友、添加群
[*]好友列表、群列表、最近会话
[*]单人聊天功能(包括发文字、表情、窗口抖动、离线文件)
[*]群聊功能(包括发文字、表情)
[*]修改密码
[*]修改个人信息(自定义昵称、签名、个性头像等个人信息)
[*]自动升级功能








5. 电驴源码

链接: https://pan.baidu.com/s/1jwFX4xc6gKNNkfIUnbFiOQ密码: 6c7w







三、书单推荐

时至今日,Modern C++ 应该也作为 C++ 技术栈的学习内容:
C++11/14 网上的资料已经很多了,C++17 的资料不多,重头戏还是 C++11 引入的各种实用特性,这就给读者推荐一本我读过的:

[*]《深入理解 C++11:C++11 新特性解析与应用》
[*]《深入应用 C++11:代码优化与工程级应用》
[*]《C++17 完全指南》
[*]《Cpp 17 in Detail》
链接: https://pan.baidu.com/s/1c34KAbydzUUa93b_nvNSYA 提取码: i47k

另外,Effective C++ 系列的作者 Scott Meyers 又写了本介绍现代 C++ 各种技巧和避坑指南的书《Effective Modern C++》,这本书也不错,推荐一下:
链接: https://pan.baidu.com/s/1HA1INg5cdHIZoQLUCgDHxQ 提取码: ghl9
链接: https://pan.baidu.com/s/14n2gYKKYCL-qrt2sCPI6tA 提取码: 7kjw我为了准备了一份详细、系统的 C++ 进阶学习书单,都放在这里了:
计算机必看经典书籍(含下载方式)
原创不易,觉得有用点个赞并关注 @张小方 我呗~

rustum 发表于 2023-1-4 20:34

代码就是要多写,不管写什么,只要写多了,水平就会从量变到质变。庸人写一万小时可以变成匠人,天赋异禀的人要成为绝世高手也需要一万小时,没有捷径。
但是人是有惰性的,学习的时候需要选择有趣味性、有成就感的东西来练手,否则就坚持不下去。当然了,更重要的是,学了以后能够为找工作积累经验,据我总结,至少有4个方向:
1、学做小游戏,比如说贪吃蛇、连连看、打飞机、2048、坦克大战等等。可以学做控制台游戏、qt做游戏、unreal做游戏,后两个方向都有详细教程。如果只是想练习C++积累代码经验,做控制台或者qt游戏就可以了,如果自己对游戏非常感兴趣,以后想从事游戏客户端开发,可以学习unreal。qt做游戏的教程:
用C++编写游戏容易吗?有什么开源的小游戏吗?能分享一下吗?unreal的教程一大堆,自己去买书就可以,我的文章以后也会分享用如何UE4做小游戏,有兴趣的可以关注。
2、学算法,看《算法竞赛入门经典》,刷leetcode,记得尽量用STL,把C++搞熟。入了算法的坑,只有时间不够用的,不存在不知道做啥的情况,因为很多题目几天做不出来太正常了。现在面试一般都有算法题,掌握常用算法基本上是及格线,算法学好是加分项。各大厂校招待遇最高的一般都是算法岗。当然,如果想从事算法方向的工作,光看这一本书还不够,还需要吃透西瓜书。
3、看《unix环境高级编程》,学习linux编程,熟悉其中的命令,然后自己动手造轮子,把很多命令重新实现一遍。比如说ls、find、tree、sort,很多命令随便一个都是上千行,一年之内实现十个命令就能学很多东西了。在实现命令的同时把linux的文件系统、进程模型都搞熟了,收获巨大;
4、学习网络编程,看《unix网络编程》,然后自己做些网络程序,比如说http服务器、聊天服务器、文件服务器、代理服务器,等等,如果还有时间,可以学习一些网络框架、rpc等等,对网络编程熟了,无论以后从事客户端还是服务器端,都很轻松。
上面的四个方向,随便进入一两个,大学四年写几万行代码,找工作就已经碾压很多人了,记得把学习的代码放在github上,这个可是面试官提前了解你的很好途径。其它:看STL源码,慢慢看懂并将其添加注释,放在github上;将stl中没有的容器算法写成STL的风格实现,这样也有成就感,但是比较枯燥,不如像leetcode上ac一道又一道的题目然后看着数字增涨那样激励人心。
另外,开源项目看哪些呢?随便找几个库的源码久可以学很久了:
A list of open source C++ libraries
页: [1]
查看完整版本: 学习完 C++ Primer 能做什么项目练手或者看什么好的开源 ...