说我有两个班级:
A类:
class A
{
private:
int _i;
public:
A(int i){_i=i;}
void update(int t){_i=t;}
friend class B;
};
B级:
class B
{
private:
A &_a;
public:
void respond();
B(A &);
};
B::B(A & a)
:_a(a)
{}
void
B::respond()
{
/*
if (a._i has been updated after last call of B::respond)
{
do something
}
else
{
do nothing
}
*/
}
无论如何要实现C ++ / C ++ 11中B::respond()
中描述的任务吗?那么_i
被指针取代而B::respond()
需要响应指针的内容吗?
请注意,我无法修改课程A
。
答案 0 :(得分:2)
有两种方法可以实现这一目标:
a._i
的值保存在B::respond()
函数中,并在下一次B::respond()
调用中与该值进行比较。A::update
时设置一些内部标志。致电B::respond()
时,请检查该标志并取消设置。答案 1 :(得分:1)
无法直接查看成员是否已被访问或更新,但存在间接技术。你可以做一些简单的事情,比如在A类中有bool _i_updated;
。然后,在A :: update(int)函数内部,每次调用函数时都只需设置_i_updated = true;
。 B::respond
可以检查if _a._i_updated {
,然后在每次发现_i_updated = false
时设置ItemSource
。
答案 2 :(得分:1)
您可以将成员变量A::_i
的值保留为class B
的成员:
class B
{
private:
A &_a;
int _i;
public:
void respond();
B(A &);
};
B::B(A & a)
:_a(a), _i(a.i)
{}
因此:
void
B::respond()
{
if (_i != a._i) {
// do something
}
else
{
// do nothing
}
_i = a._i;
}