Russian Qt Forum

Программирование => С/C++ => Тема начата: ildar от Сентябрь 18, 2009, 15:52



Название: как позвать из const методa non-const?
Отправлено: ildar от Сентябрь 18, 2009, 15:52
Код:
class A {
    void x() {
        ...
    }

    void y() const {
        x(); // <- хочется сделать такой вызов
    }
};

пытался нагуглить пример, но что то не нашлось :(

так вообще можно сделать? если да - как?


Название: Re: как позвать из const методa non-const?
Отправлено: Winstrol от Сентябрь 18, 2009, 15:53
Код:
class A {
    void x() {
        ...
    }

    void y() const {
        x(); // <- хочется сделать такой вызов
    }
};

пытался нагуглить пример, но что то не нашлось :(

так вообще можно сделать? если да - как?
нет.


Название: Re: как позвать из const методa non-const?
Отправлено: Rcus от Сентябрь 18, 2009, 15:56
только хак в виде const cast'а. А вообще это обычно нарушение контракта предоставляемого модификатором const. Если нужно модифицировать внутреннее состояние объекта не меняя внешнее, то в этом случае больше подойдут mutable члены.


Название: Re: как позвать из const методa non-const?
Отправлено: ildar от Сентябрь 18, 2009, 16:09
const_cast вроде бы позволяет работать только с переменными, но не с функциями  ???


Название: Re: как позвать из const методa non-const?
Отправлено: Igors от Сентябрь 18, 2009, 17:46
Код:
class A {
    void x() {
        ...
    }

    void y() const {
        x(); // <- хочется сделать такой вызов
    }
};
пытался нагуглить пример, но что то не нашлось :(

так вообще можно сделать? если да - как?
1) самое лучшее если "перехочется"  :)
2) определить еще один void x() const;
3) ну если уж "надо"
Код:
 void A::y() const {
        A * bad = (A *) this;
        bad->x();
 }


Название: Re: как позвать из const методa non-const?
Отправлено: pastor от Сентябрь 18, 2009, 22:18
const_cast вроде бы позволяет работать только с переменными, но не с функциями  ???


Код
C++ (Qt)
void A::y() const
{
       A *non_const_this= const_cast<A *>(this);
       non_const_this->x();
}