免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2037 | 回复: 7
打印 上一主题 下一主题

[C++] 这段代码为什么是死循环(运算符重载之转换) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-12 10:09 |只看该作者 |倒序浏览
10可用积分
#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 编辑 ]

最佳答案

查看完整内容

晕菜,你写的什么。。。仔细看看你自个儿的代码: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对象引用。。。

论坛徽章:
0
2 [报告]
发表于 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对象引用。。。

论坛徽章:
0
3 [报告]
发表于 2009-03-12 10:15 |只看该作者
这里面应该存在转换的歧义, 但我不是很清楚在哪.

消灭0回复.

论坛徽章:
0
4 [报告]
发表于 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

该怎么写呢?

论坛徽章:
0
5 [报告]
发表于 2009-03-12 10:50 |只看该作者
返回一个point对象不就完了

论坛徽章:
0
6 [报告]
发表于 2009-03-12 10:52 |只看该作者
原帖由 alexhappy 于 2009-3-12 10:50 发表
返回一个point对象不就完了


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

论坛徽章:
0
7 [报告]
发表于 2009-03-12 10:54 |只看该作者
原帖由 accelerator 于 2009-3-12 10:52 发表


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

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

论坛徽章:
0
8 [报告]
发表于 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 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP