ссылка-член констатного объекта
От: Аноним  
Дата: 29.07.07 13:56
Оценка:
class C
{
public:
    C(int &i_, int *p_)
        :
        i(i_), p(p_)
    {}
    int &i;
    int *p;
};

int main(int argc, char* argv[])
{
    int i = 9;
    const C c (i,&i);
    c.i = 1;    // <--- тут возникает желание дать компилятору по рукам
    *(c.p) = 1; // <--- тут особо не возникает
    
    return 0;
}


Код вызывает странные ощущения. Как с ними быть?
Re: ссылка-член констатного объекта
От: NikeByNike Россия  
Дата: 29.07.07 13:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Код вызывает странные ощущения. Как с ними быть?


Ну мемберы самого класса ведь не меняются?
Быть надо так:

class C
{
public:
    C(int &i_, int *p_)
        :
    i(i_), p(p_)
    {}

    void SetI(int i2) { i = i2; }
private:
    int &i;
    int *p;
};
Нужно разобрать угил.
Re[2]: ссылка-член констатного объекта
От: Аноним  
Дата: 29.07.07 14:11
Оценка: :)
Здравствуйте, NikeByNike, Вы писали:

NBN>Ну мемберы самого класса ведь не меняются?


Это понятно, просто читая код функции main возникает ощущение, что здесь ошибка, хотя формально — ошибки нет. Ощущение странное.
Re: ссылка-член констатного объекта
От: hVostt Россия http://hvostt.ru
Дата: 29.07.07 20:41
Оценка:
Здравствуйте, <Аноним>, Вы писали:


А>class C
А>{
А>public:
А>    C(int &i_, int *p_)
А>        :
А>        i(i_), p(p_)
А>    {}
А>    int &i;
А>    int *p;
А>};

А>int main(int argc, char* argv[])
А>{
А>    int i = 9;
А>    const C c (i,&i);
А>    c.i = 1;    // <--- тут возникает желание дать компилятору по рукам
А>    *(c.p) = 1; // <--- тут особо не возникает
    
А>    return 0;
А>}


А>Код вызывает странные ощущения. Как с ними быть?


Интересно, это поведение зависит от компилятора или как-то оговорено в стандарте? VS8 не ругается, а другого у меня не установлено покамесь..
... << RSDN@Home 1.2.0 alpha rev. 693>>
специализация — удел насекомых... (с) Р. Хайнлайн
Re: ссылка-член констатного объекта
От: Centaur Россия  
Дата: 30.07.07 06:19
Оценка: 72 (1)
Здравствуйте, Аноним, Вы писали:

А>
А>class C
А>{
А>public:
А>    C(int &i_, int *p_)
А>        :
А>        i(i_), p(p_)
А>    {}
А>    int &i;
А>    int *p;
А>};

А>int main(int argc, char* argv[])
А>{
А>    int i = 9;
А>    const C c (i,&i);
А>    c.i = 1;    // <--- тут возникает желание дать компилятору по рукам
А>    *(c.p) = 1; // <--- тут особо не возникает
    
А>    return 0;
А>}
А>


А>Код вызывает странные ощущения. Как с ними быть?


Константность не заразна в данном контексте. То есть не передаётся от C к содержимому по ссылке C::i.

Следует либо смириться, что всё так, либо убрать члены-данные в private и соорудить к ним accessor’ы (на которые будет распространяться константность), либо сделать два класса — C с полным интерфейсом и const_C с тем его подмножеством, которое применимо к константным объектам (см. STL iterator и const_iterator).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.