"class const - метод" - можно ли организовать?
От: _hum_ Беларусь  
Дата: 23.09.15 10:20
Оценка:
Доброго дня.
Раньше как-то сильно не задумывался и негласно для себя считал, что 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, то хотелось бы иметь гарантиии, что вызов этого слота ен приведет к повторному изменению объекта и повторному вызову сигнала (тем самым входя в цикл).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.