跟踪c ++类中的跟踪更改

时间:2014-05-20 19:00:59

标签: c++

将通过一个简单的例子解释这一点。

class Vector
{
    float X;
    float Y;
    float _length;
    float Length();
}

如果X或Y改变了,我只计算长度并将其分配给_length。如果它们都没有改变,我只需返回_length。

7 个答案:

答案 0 :(得分:5)

您需要在X / Y次修改时添加一个警卫标志(或“无效”值):

class Vector {
 public:
  Vector(float x = 0.0, float y = 0.0)
  : X{x}, Y{y}, Length{-1.0f}
  { }

  float x() const { return X; }
  float y() const { return Y; }

  float length() const {
    if (Length < 0.0f) {
      Length = sqrt(X*X + Y*Y);
    }
    return Length;
  }

  void setX(float x) { if (X != x) { Length = -1.0f; } X = x; }
  void setY(float y) { if (Y != y) { Length = -1.0f; } Y = y; }

 private:
  float X;
  float Y;
  mutable float Length;
};

mutable限定符表示这些值不属于对象的“逻辑”状态,甚至可以在const Vector实例上进行修改(通过const成员函数,自然而然)。

答案 1 :(得分:1)

xy设为私有,并添加两个函数,例如

void setX(float x) {
    this -> x = x;
    handleLengthChange();
}

void setY(float y) {
     this -> y = y;
     handleLengthChange();
}

函数handleLengthChange计算新长度。 现在,使用Vector的每个类都将使用上述方法来更改x或y。 由于x和y是私有的,只需添加两个函数来获取x和y的值。

答案 2 :(得分:0)

让您的float X, Y;私密,并为您的班级添加bool changed;。 更改X,Y将通过setter函数完成,这些函数也会将bool changed设置为false。

无论何时调用函数Length();,它都会检查bool changed变量,如果为false,则重新计算。

class Vector
    {
        float X;
        float Y;
        bool changed;
        float _length;

        void setX (float val) { // the same for Y
        X = val;
        changed = true;
        }
        float Length(){
           if (changed)
          //compute Length 
            changed = false;
            return ComputedValue;

       } 

}

答案 3 :(得分:0)

通过setter和getter使XY只能 。有一个布尔值,告诉您_length是否是最新的。在XY设置器使_length无效(通过该布尔变量)。获取长度时,检查_length是否有效。如果是的话就回来吧。如果不计算它,请使其有效并将其返回。

答案 4 :(得分:0)

首先想到的是:

class Vector
{
public:
    void setX(float x)   {changed = true; X = x;}
    void setY(float y)   {changed = true; Y = y;}

    float length()
    {
        if (changed)
            // calculate

        changed = false;
        return _Length;
    }
private:
    floate X, Y, _Length;
    bool changed;
};

编辑:我希望现在的格式化工作......

答案 5 :(得分:0)

轻松,从变量XY动态计算长度。这样,无论XY是否发生变化,您都可以获得正确的长度。

float Vector::Length()const
{
  return sqrt(X * X + Y * Y);
}

答案 6 :(得分:0)

维护保护标志或“无效”值as suggested by Jeff的替代方法是使用可以为空的对象,例如指针,最好是智能指针。当缓存是大于float的对象时,这可能更合适。

class Vector {
  float X;
  float Y;
  mutable std::unique_ptr<float> length_;

 public:
  Vector() : X(0.0f), Y(0.0f) { }
  Vector(float x, float y) : X(x), Y(y) { }

  float x() const { return X; }
  float y() const { return Y; }

  float length() const {
    if (!length_)
      length_ = std::unique_ptr<float>(new float(sqrt(X*X + Y*Y)));
    return *length_;
  }

  void setX(float x) { if (X != x) { length_.reset(); X = x; } }
  void setY(float y) { if (Y != y) { length_.reset(); Y = y; } }
};