C++/Qt 方向实训 · 第 1 / 5 天 · 对齐官方方案书 Day1
本教案假定学员已掌握 C++ 基础语法与 OOP 概念——方案书对今天下午的 官方定位是"回顾和提升",不是零基础教学。今天开始的 5 天覆盖方案书 C++方向 Day1–5 全部课堂内容,Day6–10 是纯项目实作。
这条假设不是拍脑袋定的——建议模块 B 讲授前先用 docs/teaching/PRETEST.md (10 题、10 分钟)实测一次,按结果决定原节奏推进还是回退到语法讲解。
模块 A · 讲授 35min
出处:docs/TRAINING_PLAN_2026.md 「六、实习实训服务流程」——需求分析→需求评审→项目研发/代码实现→阶段评审→ 项目测试/交付,这就是接下来 Day6–10 项目实作要走的完整流程。
出处:docs/TRAINING_PLAN_2026.md 「七、质量保证」——JIRA(任务跟踪)+ Git(版本管理)+ Wiki 知识库 + OASIS 绿洲实训管理平台,是接下来项目实作阶段的四个协作工具。
模块 A · 讨论 95min(分组,非编码)
今天上午没有编码练习——先把协作流程和项目方向定下来,Day6–10 的项目实作会真的用到今天讨论的结论。
模块 B · 讲授 35min(巡礼式,压缩讲解)
只挑「学过但容易讲不透」的点,不逐章展开——方案书官方定位是 "回顾和提升",深度让位于 Day2–5 的 Qt 内容。
"作用域"不是"文件顺序"——很多人误以为 namespace 只是给名字加前缀, 实际上它定义的是一段可以被跨文件延续、跨块合并的作用域。
编译器靠"名字改写"(name mangling)把重载函数变成不同的符号;二义性 往往不是代码写错了,而是重载集合里存在两个"一样好"的候选。
把引用理解成"自动解引用的 const 指针"——这个实现视角能解释引用为什么 必须初始化、为什么不能重新绑定。
Base* p = new Derived();
delete p; // 如果 ~Base() 不是 virtual,~Derived() 不会被调用——经典泄漏
只点名,不展开:泛型编程(函数模板/类模板)+ 容器/迭代器,是 Day6–10 项目实作里会大量用到的基础设施。
出处:p01/ch05/class_template_basics.cpp、 p01/ch09/s03/vector_iterator.cpp
cmake -S . -B build -G Ninja -DBUILD_QT_PART=OFF -DCMAKE_BUILD_TYPE=Debug
cmake --build build # 144 个目标全绿
出处:仓库根 CMakeLists.txt——
option(BUILD_QT_PART) 控制是否编译 Qt 部分,每个示例一个
add_executable 目标,这就是"一文件一目标"约定的由来。
C++ 生态的包管理器,解决"第三方库怎么装、怎么被 CMake 找到"的问题。
本仓库用的是"隔离 Qt 手动装"(tools/install_qt_host.sh)
而非 vcpkg,两种思路都要认识;本仓库暂无 vcpkg 可运行示例——安装真实
vcpkg 工具链超出最小示例范畴,此处仅作概念介绍。
模块 B · 练习 95min
cmake -S . -B build -G Ninja -DBUILD_QT_PART=OFF 配置成功;
cmake --build build 144 个目标全绿;能说出 option(BUILD_QT_PART) 的作用tools/std_probe.py 验证一个标准版本差异点(如三目运算符可否作左值)cmake --build build --target all # Part1,144 个目标全绿
每组提交一句话分工说明 + 至少 1 条 ERRATA 坑点讲解。
明天 Day2 进入 Qt:项目结构 / 信号槽 / 控件 / 布局与 QSS —— 大纲:docs/teaching/OUTLINE.md