C++ Can a C++;类函数告知自上次调用以来是否已更新对外部类的类成员引用?
假设我有两门课: A类: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 &
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然后,在A::update(int)函数中,只需设置\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
可能已经更新了,而没有更改其值。