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;
}
Код вызывает странные ощущения. Как с ними быть?
Здравствуйте, Аноним, Вы писали:
А>Код вызывает странные ощущения. Как с ними быть?
Ну мемберы самого класса ведь не меняются?
Быть надо так:
class C
{
public:
C(int &i_, int *p_)
:
i(i_), p(p_)
{}
void SetI(int i2) { i = i2; }
private:
int &i;
int *p;
};
Здравствуйте, <Аноним>, Вы писали:
А>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>>
специализация — удел насекомых... (с) Р. Хайнлайн
Здравствуйте, Аноним, Вы писали:
А>А>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).