在c ++中清理脏标志的巧妙方法

时间:2018-05-24 23:06:54

标签: c++ design-patterns software-design

我有这种情况,我试图为空间搜索结构公开一个标准API,其中构建结构的各种方法的输入数据是相同的,但搜索结构的构建方式是不同的。 我有基类上数据的setter和派生类需要实现构建搜索结构的纯虚拟Build()方法。 下面是我的基类的样子

class SpatialSearch
{
public:
  void SetData(Data data_)
  {
    this->data = data_;
    this->dirty = true;
  }

  virtual void Build() = 0;

  int search(Vec3 point)
  { 
    if(dirty)
      Build();
    // Code to perform a search. I won't get into the 
    // nitty gritty of this, but this exists as a commom
    // implementation on the base class for all the spatial 
    // search structures.
  }

private : 
  Data data;
  bool dirty;
}

因此,如果您注意到,每次搜索调用都会检查dirty标志。 如果数据在上次之后发生了变化,我会重建结构。 但是,Build方法是在派生类上实现的,我需要一种方法来强制执行在Build方法执行后将此标志设置为false的方法,而不仅仅是为编写该方法的人留下指南。派生类在其“构建”方法中具有dirty = false

简而言之,我需要一种方法来确保用户在每次执行dirty = false方法后都设置了Build

1 个答案:

答案 0 :(得分:4)

执行此操作的常用方法是使用垂直界面和水平界面(受保护和公共)。

“水平界面”是该类用户看到的那个,“垂直”界面是派生类实现者重写以添加功能的那个。

class SpatialSearch
{
public:
  void SetData(Data data_)
  {
    this->data = data_;
    this->dirty = true;
  }

  void Build() // no longer virtual
  {
    internal_build(); 
    dirty = false;
  }

  int search(Vec3 point)
  { 
    if(dirty)
      internal_build();
    // Code to perform a search. I won't get into the 
    // nitty gritty of this, but this exists as a commom
    // implementation on the base class for all the spatial 
    // search structures.
  }

protected:
  virtual void internal_build() = 0; // implementers override this

private : 
  Data data;
  bool dirty;
}

class SpecialSpatialSearch
: public SpatialSearch
{
protected:
  void internal_build() override
  {
    // do the build without caring or knowing of the 
    // existence of the dirty flag
  }
};