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

Can a C++ class function tell whether the class member reference to an outside class has been updated since last call?

本文关键字:成员 对外部 已更新 是否 引用 类函数 判断 调用 C++      更新时间:2023-10-16

假设我有两个类:

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

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

  1. a._i的值保存在B::respond()函数中,并在下一次B::respond()调用中与该值进行比较
  2. 调用A::update时设置一些内部标志。调用B::respond()时,请检查该标志并取消设置

没有办法直接查看成员是否已被访问或更新,但有一些间接技术。您可以做一些简单的事情,比如在类a中有一个bool _i_updated;。然后,在a::update(int(函数内部,只需在每次调用该函数时设置_i_updated = true;。CCD_ 12可以检查CCD_ 13,然后每次发现CCD_。

您可以将成员变量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;
}