Вот мой код:
class X
{
public:
X():_x(5){}
void GetVal(int & oVal)
{
oVal = _x;
}
private:
int _x;
};
class Y
{
public:
X * const GetX()
{
return &_x;
}
private:
X _x;
};
int main()
{
Y y;
X * p = y.GetX();
int * pInt = new int[2];
p->GetVal(pInt[0]);
}
В последней строке main я получаю сообщение об ошибке
Неверный доступ члена из const-квалифицированной функции
Эта ошибка наблюдается только тогда, когда код скомпилирован в системе Sun Solaris и не возникает в Windows или AIX. Есть идеи почему?
Также самое странное, что ошибка исчезнет, если я заменю pInt [0] простым целым числом (int a = 0; p-> GetVal (a))
const
в X * const GetX()
будет проигнорировано, потому что результатом вызова функции является rvalue, а rvalues не типа класса не может быть const
в соответствии с c ++ функция-член const, которая возвращает указатель const. Но какой тип const является возвращаемым указателем?.
Вы уверены, что не хотели писать:
const X * GetX() const
{
return &_x;
}
то есть вы изменяете его, возвращая постоянный указатель на переменную дату в переменный указатель на постоянные данные, и вы объявляете GetX()
быть постоянной функцией-членом, то есть функцией-членом, которую можно использовать в постоянных экземплярах Y: const Y y;
Кроме того, в class X
, ты можешь измениться GetVal()
в
void GetVal(int & oVal) const
{
oVal = _x;
}
Других решений пока нет …