C ++类函数可以判断自上次调用以来是否已更新类成员对外部类的引用?

时间:2015-07-10 19:49:14

标签: c++ c++11

说我有两个班级:

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

3 个答案:

答案 0 :(得分:2)

有两种方法可以实现这一目标:

  1. a._i的值保存在B::respond()函数中,并在下一次B::respond()调用中与该值进行比较。
  2. 调用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;
}