[C++]参照と演算子のオーバーロード

[戻る]
hrs 2004/09/04(土) 16:46:55
以下のソースで、

[user@host hoge]$ g++ test.cpp
test.cpp: function 内の `void test(const Point&)':
test.cpp:41: error: passing `const Point' as `this' argument of `Point
   Point::operator+(const Point&)' discards qualifiers
[user@host hoge]$ 

というエラーが出ます。41行目は、「pb = pa + pb;」のところなんですけど、
これ「pb = pa + pb;」にするとエラーがなくなるんです。結果も正しく出ます。

何でなんでしょうか?
test関数の引数paがconstだからなんでしょうが、
オーバーロードやってるとこで、それをいじっていないから関係ないような気がするんですが。

御教授願います。
----------------------------------------- ソース
#include <iostream>
using namespace std;
class Point {
public:
    Point();
    Point(int ix, int iy);
    ~Point();
    int x;
    int y;

    // オーバーロード
    Point operator=(const Point &pt);
    Point operator+(const Point &pt);
};
Point::Point(){};
Point::~Point(){};
Point::Point(int ix, int iy)
{
    x = ix;
    y = iy;
}
Point Point::operator=(const Point &pt)
{
    if (&pt != this) {
        x = pt.x;
        y = pt.y;
    }
    return *this;
}
Point Point::operator+(const Point &pt)
{
    Point hoge;
    hoge.x = x + pt.x;
    hoge.y = y + pt.y;
    return hoge;
}
void test(const Point &pa)
{
    Point pb(34, 56);
    pb = pa + pb;
    cout << pb.x << endl;
    cout << pb.y << endl;
}
int main()
{
    Point pc(12, 34);
    test(pc);
}
----------------------------------------------- ここまで

hrs 2004/09/04(土) 16:48:27
すみません。
> これ「pb = pa + pb;」にするとエラーがなくなるんです。結果も正しく出ます。
これ「pb = pb + pa;」にするとエラーがなくなるんです。結果も正しく出ます。
の間違いです。

a 2004/09/04(土) 17:43:47
paがconstだからconstでないメンバ関数(operator+)が呼べないんでは?

hrs 2004/09/04(土) 17:46:50
const Point Point::operator+(const Point &pt)
{
    Point hoge(x, y);
    hoge.x += pt.x;
    hoge.y += pt.y;
    return hoge;
}
にすれば、アクセスできる・・・
という、ことでしょうか?

試してみましたけど、できませんでした。

a 2004/09/04(土) 17:50:11
「constメンバ関数」で検索してみてください。
constなオブジェクトはconstメンバ関数しか呼び出せません。

hrs 2004/09/04(土) 17:58:45
[[解決]]
aさん、ありがとうございます。
Point operator+(const Point &pt) const;
で宣言するのが、constメンバ関数だったのですね。
無知をさらけだしてしまいました。
まぁ、C++をやり始めたばかりなので御勘弁を。

古いスレッドには追加発言できません。