3

これが私のコードです:

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)) に置き換えるとエラーがなくなることです。

4

1 に答える 1

1

関数呼び出しの結果は右辺値であり、非クラス型の右辺値は、const ポインターを返す c++ const メンバー関数に従うことができないため、constinは無視されます。しかし、返されるポインターはどの型の const ですか? .X * const GetX()const

あなたが書くつもりはなかったのですか:

const X * GetX() const
{
  return &_x;
}

つまり、変数 date への定数ポインターを定数データへの変数ポインターに戻すことから変更し、GetX()Y の定数インスタンスで使用できるメンバー関数である定数メンバー関数として宣言します。const Y y;

さらに では、次のようにclass X変更できます。GetVal()

void GetVal(int & oVal) const
{
  oVal = _x;
}
于 2012-10-29T08:06:50.193 に答える