2009-10-30 24 views
1

假设我想让一个类中的一个变量总是与另一个变量处于某种关系,而不显式地更改“链接”变量。在C++的类中链接2个变量的方法

例如:int foo总是比int小10。

这样做,如果我改变了酒吧,foo也会改变。有没有办法做到这一点? (整数溢出是不是真的有可能,所以不要担心。)

例子:(显然是行不通的,但一般代码的理解)

class A 
{ 
    int x; 
    int y = x - 10; // Whenever x is changed, y will become 10 less than x 
}; 
+0

C++有像PHP中一样通过引用实例化变量吗?你可以实例化y来获得对x-10的引用,所以当x改变时,x-10也改变为y。 – 2009-10-30 00:39:32

+0

我会建议James的解决方案只使用一个变量。如果由于某种原因你不能这样做,访问控制(私人成员)可以帮助你执行这个不变量,因为在课堂外没有人可以与x和y混在一起。 – sellibitze 2009-10-30 06:50:44

回答

8

不,你不能去做。这样做你最好的选择是使用存取和mutator成员函数:

int getFoo() 
{ 
    return foo_; 
} 

void setFoo(int newFoo) 
{ 
    foo_ = newFoo; 
} 

int getBar() 
{ 
    return foo_ + 10; 
} 

void setBar(int newBar) 
{ 
    foo_ = newBar - 10; 
} 
+0

我不想明确地做。 – trikker 2009-10-30 00:04:02

+0

这是唯一的方法...... – EToreo 2009-10-30 00:05:11

+0

好的,谢谢你的回应。我想我会找出一些东西。 – trikker 2009-10-30 00:09:07

3

这就是所谓不变。这是一种应该保持的关系,但不能通过编程语言提供的手段强制执行。不变量只有在真正有必要时才应该引入。在某种程度上,这是一个相对“不好”的事情,因为它们可能会被无意中破坏。所以,你必须问自己的第一个问题是你是否真的需要引入那个不变量。也许你可以在这种情况下没有两个变量,就像詹姆斯在他的回答中所建议的那样,可以从第一个变量中随时生成第二个值。但是如果你确实需要两个变量(而且经常没有办法解决这个问题),那么你最终会得到一个不变的结果。当然,可以用C++手动实现某些东西,这些东西可以将变量有效地链接在一起,并在其他变化时改变它们,但大多数时候不值得这样做。如果你真的需要两个变量,你可以做的最好的事情是,要小心地手动保持所需的关系,并使用大量的断言来验证不变量,只要它可以中断(有时甚至不能) ,就像

assert(y == x - 10); 

你的情况。另外,我希望有一些高级的第三方C++库(例如Boost)提供一些高级断言工具,这些工具可以被自定义编程以监视代码中的不变量(我不能尽管如此),也就是说,你可以在这里为你工作,但它必须是一个图书馆解决方案。核心语言在这里不会帮助你。

+0

+1但我认为你应该在班级和私人成员上添加一些关于你的答案。访问控制有助于实施不变量。 – sellibitze 2009-10-30 06:48:09

2

您可以创建一个新的结构,其中包含两个变量并使您希望使用的操作符过载。类似于上面的James McNellis的答案,但是只要您对相关变量进行操作,就可以让它“自动”发生。

class DualStateDouble 
{ 
public: 
    DualStateDouble(double &pv1,double &pv2) : m_pv1(pv1),m_pv2(pv2) 
    // overload all operators needed to maintain the relationship 
    // operations on this double automatically effect both values 
private: 
    double *m_pv1; 
    double *m_pv2; 
};