C++ 毕设入门教程
前言
C++ 在毕设中常用于:算法仿真、游戏开发(Unreal Engine)、图像处理(OpenCV)、桌面应用(Qt)、单片机上位机。本教程从实际毕设需求出发,帮你快速搭建能用的 C++ 项目。
第一章:选择合适的 C++ 标准
毕设推荐 C++17(兼容性好)或 C++20(新特性多)。
set(CMAKE_CXX_STANDARD 17)
毕设中最常用的现代特性
| 特性 |
用途 |
auto |
省去冗长类型声明 |
vector / map / set |
STL 容器,替代 C 数组 |
unique_ptr / shared_ptr |
告别 new/delete |
| Lambda |
回调、排序、线程传参 |
std::thread / std::async |
多线程加速 |
| Range-for |
简洁遍历 |
第二章:项目结构最佳实践
毕设项目推荐结构(以图像处理项目为例):
ImageProcessor/
├── CMakeLists.txt
├── src/
│ ├── main.cpp
│ ├── ImageLoader.cpp
│ ├── Filter.cpp
│ └── Utils.cpp
├── include/
│ ├── ImageLoader.h
│ ├── Filter.h
│ └── Utils.h
├── tests/
│ └── test_filter.cpp
└── data/
└── sample.jpg
CMakeLists.txt 模板:
cmake_minimum_required(VERSION 3.16)
project(ImageProcessor LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
# 自动收集源文件
file(GLOB_RECURSE SOURCES src/*.cpp)
add_executable(${PROJECT_NAME} ${SOURCES})
target_include_directories(${PROJECT_NAME} PRIVATE include)
# 链接 OpenCV(如有)
find_package(OpenCV QUIET)
if(OpenCV_FOUND)
target_link_libraries(${PROJECT_NAME} PRIVATE ${OpenCV_LIBS})
endif()
第三章:常见毕设场景与代码
场景一:串口通信上位机(Qt + C++)
参考 Qt 例程中的信号与槽模式,配合 QSerialPort 即可实现。
场景二:图像处理(OpenCV)
人脸检测 10 行搞定:
cv::CascadeClassifier face_cascade;
face_cascade.load("haarcascade_frontalface_default.xml");
std::vector<cv::Rect> faces;
face_cascade.detectMultiScale(gray, faces);
for (const auto& face : faces)
cv::rectangle(img, face, cv::Scalar(0, 255, 0), 2);
场景三:算法可视化(控制台 + 文件输出)
把运算结果写入 CSV,用 Python/Excel 可视化,是最省事的方案:
#include <fstream>
std::ofstream csv("result.csv");
csv << "x,y\n";
for (int i = 0; i < 100; i++)
csv << i << "," << sin(i * 0.1) << "\n";
第四章:调试与排错
必学 GDB 命令
g++ -g -o program program.cpp
gdb ./program
(gdb) break main.cpp:42
(gdb) run
(gdb) print variable
(gdb) backtrace
(gdb) continue
常见错误速查
| 错误 |
原因 |
| Segmentation Fault |
空指针/野指针/数组越界 |
| undefined reference |
链接时找不到函数定义,检查 CMake 链接 |
| double free |
同一内存释放了两次 |
| STL 迭代器失效 |
遍历容器时修改了容器结构 |
第五章:毕设答辩准备
- 代码要能跑:答辩现场至少演示一个完整流程
- 注释要清楚:关键函数写 Doxygen 风格注释
- README.md:放项目介绍、编译方式、运行截图
- 版本管理:用 Git 记录开发过程,提交历史也是工作量证明
思考题
shared_ptr 和 unique_ptr 的区别是什么?什么时候该用哪个?
- 如何用 CMake 引入第三方库(如 nlohmann/json)?
- C++ 中如何处理 CSV 文件的读写?