C++中如何强制在Build执行后重置dirty标志的巧妙方案
解决方法:用模板方法模式固定状态管理逻辑
你的问题核心是要把**“构建后重置dirty标志”这个通用逻辑从派生类的可变构建逻辑中分离出来,避免依赖派生类开发者的自觉。最适合的方案是使用模板方法模式**,让基类完全掌控状态变更的固定步骤,只把真正的构建逻辑交给派生类实现。
具体做法是:
- 将原来的纯虚
Build()拆分为两个部分:基类的非虚Build()方法(负责固定流程),以及受保护的纯虚DoBuild()方法(由派生类实现实际构建) - 基类的
Build()方法会先调用派生类的DoBuild(),然后强制把dirty设为false,完全不让派生类插手这一步
修改后的基类代码如下:
class SpatialSearch { public: void SetData(Data data_) { this->data = data_; this->dirty = true; } // 基类提供的非虚Build方法,固定流程 void Build() { DoBuild(); // 调用派生类的实际构建逻辑 dirty = false; // 强制重置dirty,派生类无法绕过 } int search(Vec3 point) { if(dirty) Build(); // 通用搜索逻辑,保持不变 } private: Data data; bool dirty; protected: // 派生类必须实现的纯虚方法,只负责实际构建 virtual void DoBuild() = 0; };
为什么这个方案有效?
- 强制保证状态正确:不管派生类怎么实现
DoBuild(),基类的Build()都会在最后把dirty设为false,完全避免了遗漏的可能 - 职责分离:派生类只需要专注于自己的搜索结构构建逻辑,不用关心状态管理的细节
- 兼容性好:
search()方法的逻辑完全不用修改,依然保持“脏检查-构建-搜索”的流程
举个派生类的实现例子,开发者只需要实现DoBuild():
class KDTree : public SpatialSearch { protected: void DoBuild() override { // 这里写KDTree的具体构建逻辑,不用管dirty // ... } };
这样设计后,你再也不用担心派生类忘记重置dirty标志,所有状态管理的通用逻辑都牢牢掌握在基类手中。
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

