将通过一个简单的例子解释这一点。
class Vector
{
float X;
float Y;
float _length;
float Length();
}
如果X或Y改变了,我只计算长度并将其分配给_length。如果它们都没有改变,我只需返回_length。
答案 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)
将x
和y
设为私有,并添加两个函数,例如
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使X
和Y
只能 。有一个布尔值,告诉您_length
是否是最新的。在X
和Y
设置器使_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)
轻松,从变量X
和Y
动态计算长度。这样,无论X
或Y
是否发生变化,您都可以获得正确的长度。
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; } }
};