unix — «ошибка постоянного доступа» на солнце ОС при компиляции кода C ++

Вот мой код:

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))

3

Решение

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;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]