Chinaunix

标题: 这段代码为什么是死循环(运算符重载之转换) [打印本页]

作者: accelerator    时间: 2009-03-12 10:09
标题: 这段代码为什么是死循环(运算符重载之转换)
#include <iostream>

using std::cout;
using std::endl;

class Point;

class Complex {

public:

        Complex(int aReal = 0, int aImaginary = 0):iReal(aReal), iImaginary(aImaginary) {}

        int Real() const { return iReal; }

        int Imaginary() const { return iImaginary; }

        void setReal(int aReal) { iReal = aReal; }

        void setImagin(int aImaginary) { iImaginary = aImaginary; }

        operator const Point&() const
        { cout << "operator const Point&() const" << endl; return *this; }

        const Point& operator()() const
        { cout << "const Point& operator()() const" << endl; return *this; }

        void Print() const { cout << iReal << " + " << iImaginary << "i" << endl; }

private:
        int iReal;
        int iImaginary;
};

class Point {
public:
        Point(int aX = 0, int aY = 0):iX(aX), iY(aY) {}
       
        Point(Point& aPoint):iX(aPoint.X()), iY(aPoint.Y()) {}
       
        int X() const { return iX; }
       
        int Y() const { return iY; }
       
        void setX(int aX) { iX = aX; }
       
        void setY(int aY) { iY = aY; }
       
        void Print() const { cout << "(" << iX << ", " << iY << "" << endl; }

private:
        int iX;
        int iY;
};

void PrintPoint(const Point& aPoint)
{
        cout << "3rd part print begin:" << endl;
        aPoint.Print();
        cout << "3rd part print end:" << endl;
}

int main(void)
{
        Complex a(3, 2);
        a.Print();
        a().Print();
        PrintPoint(a);
        return 0;
}


为什么没有调用const Point& operator()() const, 而在调用operator const Point&() const的地方发生了死循环, 10分悬赏

[ 本帖最后由 accelerator 于 2009-3-12 10:11 编辑 ]
作者: alexhappy    时间: 2009-03-12 10:09
晕菜,你写的什么。。。

仔细看看你自个儿的代码:a()首先调用const Point& operator()() const,而在const Point& operator()() const这里面会调用operator const Point&() const,问题来了
operator const Point&() const要求返回一个Point对象引用,很明显return *this是Complex对象,那么它又会去调用operator const Point&() const返回一个Point对象引用。。。
作者: accelerator    时间: 2009-03-12 10:15
这里面应该存在转换的歧义, 但我不是很清楚在哪.

消灭0回复.
作者: accelerator    时间: 2009-03-12 10:48
原帖由 alexhappy 于 2009-3-12 10:09 发表
晕菜,你写的什么。。。

仔细看看你自个儿的代码:a()首先调用const Point& operator()() const,而在const Point& operator()() const这里面会调用operator const Point&() const,问题来了
operator cons ...



I see.
多谢!

那这个转换函数
        operator const Point&() const

该怎么写呢?
作者: alexhappy    时间: 2009-03-12 10:50
返回一个point对象不就完了
作者: accelerator    时间: 2009-03-12 10:52
原帖由 alexhappy 于 2009-3-12 10:50 发表
返回一个point对象不就完了


按值返回? return Point(x, y)?
作者: alexhappy    时间: 2009-03-12 10:54
原帖由 accelerator 于 2009-3-12 10:52 发表


按值返回? return Point(x, y)?

你那是临时对象,会出错的。。。
相信现在你有解决方法了吧?
作者: accelerator    时间: 2009-03-12 11:03
原帖由 alexhappy 于 2009-3-12 10:54 发表

你那是临时对象,会出错的。。。
相信现在你有解决方法了吧?


这样不会出错的
operator Point() const { return Point(iReal, iImaginary); }



什么方案, 像这样?
operator const Point&() const
{
cout << "operator const Point&() const" << endl;
return *(reinterpret_cast<oint*>(const_cast<Complex*>(this)));
}


[ 本帖最后由 accelerator 于 2009-3-12 11:05 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2