每个「讲」知识点补齐核心概念 + 常见的坑,幻灯片与大纲同步
此前一版「讲」部分基本只是代码演示(贴代码 + 一句出处说明),没有讲透 知识点本身的原理。改为覆盖清单原则:每个知识点在大纲里至少固定两项—— 核心概念(是什么/为什么,不只是怎么写)+ 常见的坑(注意事项/误区), 课堂实际讲解深度按学员反馈现场调整,但大纲必须列全,以免漏讲或退化成 纯代码演示。 - custom.css 新增 .concept-box/.pitfall-box 卡片样式 - day1–5.html 每个知识点前插入对应卡片,内容与 OUTLINE.md 的覆盖清单一一对应
This commit is contained in:
+147
-23
@@ -47,20 +47,52 @@
|
||||
|
||||
<section>
|
||||
<h3>实习实训服务流程 <span class="tag tag-lecture">讲</span></h3>
|
||||
<img src="../../images/training_service_flow.png" style="max-height:480px;">
|
||||
<img src="../../images/training_service_flow.png" style="max-height:520px;">
|
||||
<p><small>出处:<a class="filelink" target="_blank"
|
||||
href="../../TRAINING_PLAN_2026.md">docs/TRAINING_PLAN_2026.md</a>
|
||||
「六、实习实训服务流程」——需求分析→需求评审→项目研发/代码实现→阶段评审→
|
||||
项目测试/交付,这就是接下来 Day6–10 项目实作要走的完整流程。</small></p>
|
||||
href="../../TRAINING_PLAN_2026.md">docs/TRAINING_PLAN_2026.md</a> 「六、实习实训服务流程」</small></p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3>服务流程:核心概念 <span class="tag tag-lecture">讲</span></h3>
|
||||
<div class="concept-box">
|
||||
<h4>核心概念</h4>
|
||||
<ul>
|
||||
<li>需求分析→需求评审→项目研发/代码实现→阶段评审→项目测试/交付——每个环节都有明确的
|
||||
"评审"节点把关,不是写完代码就结束,这就是接下来 Day6–10 项目实作要走的完整流程。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="pitfall-box">
|
||||
<h4>常见误区</h4>
|
||||
<ul>
|
||||
<li>把"需求分析"当成走过场:跳过评审直接开始编码,后期返工成本远高于前期多花时间对齐需求。</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3>质量保证:四平台一标准 <span class="tag tag-lecture">讲</span></h3>
|
||||
<img src="../../images/quality_four_platforms.png" style="max-height:420px;">
|
||||
<img src="../../images/quality_four_platforms.png" style="max-height:520px;">
|
||||
<p><small>出处:<a class="filelink" target="_blank"
|
||||
href="../../TRAINING_PLAN_2026.md">docs/TRAINING_PLAN_2026.md</a>
|
||||
「七、质量保证」——JIRA(任务跟踪)+ Git(版本管理)+ Wiki 知识库 +
|
||||
OASIS 绿洲实训管理平台,是接下来项目实作阶段的四个协作工具。</small></p>
|
||||
href="../../TRAINING_PLAN_2026.md">docs/TRAINING_PLAN_2026.md</a> 「七、质量保证」</small></p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3>四平台一标准:核心概念 <span class="tag tag-lecture">讲</span></h3>
|
||||
<div class="concept-box">
|
||||
<h4>核心概念</h4>
|
||||
<ul>
|
||||
<li>JIRA(任务跟踪)+ Git(版本管理)+ Wiki 知识库 + OASIS 绿洲实训管理平台,四个工具
|
||||
分别对应"谁在做什么/代码怎么变化/知识怎么沉淀/进度怎么被看到"四个不同维度,缺一个都会
|
||||
让协作出现盲区。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="pitfall-box">
|
||||
<h4>常见误区</h4>
|
||||
<ul>
|
||||
<li>只用 Git 不用 Jira:代码有了版本历史,但"谁负责什么、进度到哪"没有可见记录,
|
||||
团队协作时容易重复劳动或漏项。</li>
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
@@ -112,8 +144,21 @@
|
||||
|
||||
<section>
|
||||
<h3>namespace 作用域 <span class="tag tag-lecture">讲</span></h3>
|
||||
<p>"作用域"不是"文件顺序"——很多人误以为 namespace 只是给名字加前缀,
|
||||
实际上它定义的是一段可以被跨文件延续、跨块合并的作用域。</p>
|
||||
<div class="concept-box">
|
||||
<h4>核心概念</h4>
|
||||
<ul>
|
||||
<li>"作用域"不是"文件顺序"——很多人误以为 namespace 只是给名字加前缀,实际上它定义的是
|
||||
一段可以被跨文件延续、跨块合并的作用域,同一个命名空间可以在多个文件里反复打开、追加内容。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="pitfall-box">
|
||||
<h4>常见的坑</h4>
|
||||
<ul>
|
||||
<li>在头文件里写 <code>using namespace std;</code>:会把整个命名空间污染带给所有
|
||||
include 这个头文件的地方,容易引发命名冲突,规范做法是只在 .cpp 里用,或干脆不用、
|
||||
全程写限定名。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<p><small>出处:<a class="filelink" target="_blank"
|
||||
href="../../../p01/ch03/namespace_syntax.cpp">p01/ch03/namespace_syntax.cpp</a>,
|
||||
对照 <a class="filelink" target="_blank" href="../../ERRATA.md">docs/ERRATA.md</a></small></p>
|
||||
@@ -121,16 +166,40 @@
|
||||
|
||||
<section>
|
||||
<h3>函数重载决议 <span class="tag tag-lecture">讲</span></h3>
|
||||
<p>编译器靠"名字改写"(name mangling)把重载函数变成不同的符号;二义性
|
||||
往往不是代码写错了,而是重载集合里存在两个"一样好"的候选。</p>
|
||||
<div class="concept-box">
|
||||
<h4>核心概念</h4>
|
||||
<ul>
|
||||
<li>编译器靠"名字改写"(name mangling)把重载函数变成不同的符号;二义性往往不是代码写
|
||||
错了,而是重载集合里存在两个"一样好"的候选,编译器无法替你选。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="pitfall-box">
|
||||
<h4>常见的坑</h4>
|
||||
<ul>
|
||||
<li>隐式类型转换会扩大重载候选集——比如 <code>int</code>/<code>double</code> 都能转
|
||||
<code>float</code> 参数,传一个 <code>long</code> 进去可能触发意料之外的重载版本。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<p><small>出处:<a class="filelink" target="_blank"
|
||||
href="../../../p01/ch03/function_overload_mechanism.cpp">p01/ch03/function_overload_mechanism.cpp</a></small></p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3>引用的本质 <span class="tag tag-lecture">讲</span></h3>
|
||||
<p>把引用理解成"自动解引用的 const 指针"——这个实现视角能解释引用为什么
|
||||
必须初始化、为什么不能重新绑定。</p>
|
||||
<div class="concept-box">
|
||||
<h4>核心概念</h4>
|
||||
<ul>
|
||||
<li>把引用理解成"自动解引用的 const 指针"——这个实现视角能解释引用为什么必须初始化、
|
||||
为什么不能重新绑定到另一个对象。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="pitfall-box">
|
||||
<h4>常见的坑</h4>
|
||||
<ul>
|
||||
<li>返回局部变量的引用:函数结束局部变量已销毁,返回的引用变成悬空引用,后续访问是
|
||||
未定义行为——和返回局部变量指针是同一类坑。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<p><small>出处:<a class="filelink" target="_blank"
|
||||
href="../../../p01/ch03/reference_essence.cpp">p01/ch03/reference_essence.cpp</a></small></p>
|
||||
</section>
|
||||
@@ -141,14 +210,41 @@
|
||||
Base* p = new Derived();
|
||||
delete p; // 如果 ~Base() 不是 virtual,~Derived() 不会被调用——经典泄漏
|
||||
</code></pre>
|
||||
<div class="concept-box">
|
||||
<h4>核心概念</h4>
|
||||
<ul>
|
||||
<li>通过基类指针 <code>delete</code> 派生类对象时,只有基类析构函数是 <code>virtual</code>
|
||||
才会走虚函数表找到派生类的析构函数——这是"多态"在析构这个场景下的具体体现。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="pitfall-box">
|
||||
<h4>常见的坑</h4>
|
||||
<ul>
|
||||
<li>只要一个类可能被继承、且可能通过基类指针删除派生对象,就应该把析构函数声明为
|
||||
<code>virtual</code>——即使当前基类本身没什么要清理的,这是个防御性约定。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<p><small>出处:<a class="filelink" target="_blank"
|
||||
href="../../../p01/ch04/s08/virtual_dtor_purpose.cpp">p01/ch04/s08/virtual_dtor_purpose.cpp</a></small></p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3>模板与 STL 速览 <span class="tag tag-lecture">讲</span></h3>
|
||||
<p>只点名,不展开:泛型编程(函数模板/类模板)+ 容器/迭代器,是 Day6–10
|
||||
项目实作里会大量用到的基础设施。</p>
|
||||
<div class="concept-box">
|
||||
<h4>核心概念</h4>
|
||||
<ul>
|
||||
<li>只点名,不展开:泛型编程(函数模板/类模板)让同一份代码适配不同类型,容器/迭代器
|
||||
是 Day6–10 项目实作里会大量用到的基础设施——迭代器是"容器和算法之间的统一接口",这也是
|
||||
STL 能让算法脱离具体容器类型复用的关键。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="pitfall-box">
|
||||
<h4>常见的坑</h4>
|
||||
<ul>
|
||||
<li>容器扩容/删除元素后,之前保存的迭代器可能失效(如 <code>vector</code> 扩容),
|
||||
继续用失效的迭代器是未定义行为——遍历中增删元素前要先弄清对应容器的迭代器失效规则。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<p><small>出处:<a class="filelink" target="_blank"
|
||||
href="../../../p01/ch05/class_template_basics.cpp">p01/ch05/class_template_basics.cpp</a>、
|
||||
<a class="filelink" target="_blank" href="../../../p01/ch09/s03/vector_iterator.cpp">p01/ch09/s03/vector_iterator.cpp</a></small></p>
|
||||
@@ -158,19 +254,47 @@ delete p; // 如果 ~Base() 不是 virtual,~Derived() 不会被调用——
|
||||
<h3>CMake:用本仓库当教材 <span class="tag tag-lecture">讲</span></h3>
|
||||
<pre><code class="bash" data-trim>cmake -S . -B build -G Ninja -DBUILD_QT_PART=OFF -DCMAKE_BUILD_TYPE=Debug
|
||||
cmake --build build # 144 个目标全绿</code></pre>
|
||||
<p><small>出处:仓库根 <a class="filelink" target="_blank" href="../../../CMakeLists.txt">CMakeLists.txt</a>——
|
||||
<code>option(BUILD_QT_PART)</code> 控制是否编译 Qt 部分,每个示例一个
|
||||
<code>add_executable</code> 目标,这就是"一文件一目标"约定的由来。</small></p>
|
||||
<div class="concept-box">
|
||||
<h4>核心概念</h4>
|
||||
<ul>
|
||||
<li>CMake 是"生成构建系统的工具"而不是构建系统本身:<code>cmake -S -B</code> 读
|
||||
<code>CMakeLists.txt</code> 生成 Ninja/Makefile 工程,<code>cmake --build</code> 才是
|
||||
真正编译。<code>option(BUILD_QT_PART)</code> 控制是否编译 Qt 部分,每个示例一个
|
||||
<code>add_executable</code> 目标,这就是"一文件一目标"约定的由来。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="pitfall-box">
|
||||
<h4>常见的坑</h4>
|
||||
<ul>
|
||||
<li>改了 <code>CMakeLists.txt</code> 却没重新 <code>cmake</code> 配置(只 <code>build</code>):
|
||||
大多数改动 CMake 会自动侦测重新配置,但换了生成器/清了缓存等情况需要重新走
|
||||
<code>-S -B</code> 一次。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<p><small>出处:仓库根 <a class="filelink" target="_blank" href="../../../CMakeLists.txt">CMakeLists.txt</a></small></p>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h3>Vcpkg 包管理器(概念,无演示) <span class="tag tag-lecture">讲</span></h3>
|
||||
<p>C++ 生态的包管理器,解决"第三方库怎么装、怎么被 CMake 找到"的问题。</p>
|
||||
<div class="concept-box">
|
||||
<h4>核心概念</h4>
|
||||
<ul>
|
||||
<li>C++ 生态的包管理器,解决"第三方库怎么装、怎么被 CMake 找到"的问题——一次
|
||||
<code>vcpkg install</code>,配合 CMake 的 toolchain 文件,<code>find_package</code>
|
||||
就能自动找到头文件和库。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="pitfall-box">
|
||||
<h4>常见的坑</h4>
|
||||
<ul>
|
||||
<li>不是所有第三方库都必须用包管理器装——本仓库用的是"隔离 Qt 手动装"
|
||||
(<code>tools/install_qt_host.sh</code>)而非 vcpkg,两种思路都要认识:包管理器省心但
|
||||
引入额外工具链,手动隔离装则精确控制版本/路径,各有取舍。</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="verify-box">
|
||||
<h4>缺口说明</h4>
|
||||
<p>本仓库用的是"隔离 Qt 手动装"(<code>tools/install_qt_host.sh</code>)
|
||||
而非 vcpkg,两种思路都要认识;本仓库暂无 vcpkg 可运行示例——安装真实
|
||||
vcpkg 工具链超出最小示例范畴,此处仅作概念介绍。</p>
|
||||
<p>本仓库暂无 vcpkg 可运行示例——安装真实 vcpkg 工具链超出最小示例范畴,此处仅作概念介绍。</p>
|
||||
</div>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
Reference in New Issue
Block a user