Доброго дня.
Раньше как-то сильно не задумывался и негласно для себя считал, что const-спецификатор метода гарантирует неизменность полей объекта, из которого этот метод вызывается. А вот когда начал работать с сигнал-слот-архитектурой, увидел, что это, вообще говоря, не так:
class C_B;
////////////////////////////
//// C_A ////
////////////////////////////
class C_A
{
C_B* m_pB;
int m_x;
public:
//------------------------------------------
void set_pB(C_B* pB){m_pB = pB;}
//------------------------------------------
void set_x(int x) {m_x = x;}
//------------------------------------------
void foo_A(void)const;// несмотря на const, вызов этой функции может изменить значение поля m_x
//------------------------------------------
};
////////////////////////////
////////////////////////////
//// C_B ////
////////////////////////////
class C_B
{
C_A* m_pA;
public:
//------------------------------------------
C_B(C_A* pA):m_pA(pA){}
//------------------------------------------
void foo_B(void){ m_pA->set_x(10);}
//------------------------------------------
};
////////////////////////////
//------------------------------------------
void C_A::foo_A(void)const
{
m_pB->foo_B();
}
//------------------------------------------
void main(void)
{
C_A A;
C_B B(&A);
A.set_pB(&B);
A.set_x(0);
A.foo_A();
}
Потому встал вопрос, есть ли в других языках или в новом стандарте с++ что-нибудь наподобие "class const — метода", который делает
константными ЛЮБЫЕ this данного класса в своей области видимости, и тем самым предотвращает всякое изменение любого (а значит и заданного)объекта данного класса?
Это понадобилось, в частности, для того, чтобы на этапе компиляции отлавливать зацикливания. Например,
если foo_A воспринимаеть как сигнал о модификации объекта, к которому приконнекчен слот foo_B, то хотелось бы иметь гарантиии, что вызов этого слота ен приведет к повторному изменению объекта и повторному вызову сигнала (тем самым входя в цикл).