Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Can a C++;类函数告知自上次调用以来是否已更新对外部类的类成员引用?_C++_C++11 - Fatal编程技术网

C++ Can a C++;类函数告知自上次调用以来是否已更新对外部类的类成员引用?

C++ Can a C++;类函数告知自上次调用以来是否已更新对外部类的类成员引用?,c++,c++11,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 &

假设我有两门课:

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()
中描述的任务是否需要实现?那么
\u i
被指针替换,而
B::respond()
需要响应指针的内容呢


请注意,我无法修改class
A

无法直接查看成员是否已被访问或更新,但有间接技术。你可以做一些简单的事情,比如更新
bool\u\u i\u updated=true每次调用函数时<代码>B::响应
可以检查
是否已更新{
并在每次发现它为真时设置
\u i_updated=false

无法直接查看成员是否已被访问或更新,但有间接技术。您可以做一些简单的事情,比如在类a中使用
bool\u updated;
。然后,在a::update(int)内部函数,只需在每次调用函数时设置
\u i\u updated=true;
B::respond
可以检查
是否更新了{
,然后在每次发现为true时设置
\u i\u updated=false。

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

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

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

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

  • 您可以将成员变量
    A::i
    的值保留为
    类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;
    }
    

    您可以将成员变量
    A::i
    的值保留为
    类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;
    }
    

    听起来你是在暗示,听起来你是在暗示,这两种方式是不等价的。第一种可能是ABA问题。这是否真的是一个问题取决于OP对术语“更新”的解释.事实上,我认为第一种方法不是一个好主意。因为
    a.\u I
    可能在没有更改其值的情况下进行了更新。这两种方法不等价是毫无意义的。第一种方法可能会遇到所谓的ABA问题。这是否真的是一个问题取决于OP对该术语的解释“更新”。事实上,我认为第一种方法不是一个好主意。因为
    a.\u I
    可能已经更新了,而没有更改其值。