游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1940|回复: 4

operator的问题程序

[复制链接]

3

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2009-3-8 06:41:00 | 显示全部楼层 |阅读模式
写了个关于operator的重载练习题 类的乘法交换律
出了很大的问题请帮助更正

#include<iostream>
using namespace std;

class Stonewt
{
private:
        double number;

public:
        Stonewt();
        Stonewt(double n);
        Stonewt operator *(const Stonewt &s)const;
        friend Stonewt operator *(double n,const Stonewt &s);
        void Show()const;
};

Stonewt::Stonewt()
{
        number = 0;
}

Stonewt::Stonewt(double n)
{
        number = n;
}

Stonewt Stonewt:perator *(const Stonewt &s) const
{
        return s;
}

Stonewt operator *(double n,const Stonewt &s)
{
        return s * n;
}

void Stonewt::Show()const
{
        cout<<" * is "<<number<<endl;
}

int main(void)
{
        Stonewt st(30.0);
        Stonewt s;
        Stonewt t;
        double d = 12.0;
        s = d * st  ;
    s.Show();
        t = st * d;
        t.Show();
        return 0;
}

调试了下说不出的奇怪  ...

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2009-3-8 13:19:00 | 显示全部楼层

Re:operator的问题程序

Stonewt operator *(double n,const Stonewt &s)
{
return s * n;
}
让你的乘法交换律用不起。因为:
t = st * d;
隐式转换不起作用了。
SO,鉴于你的构造函数没有声明成 explicit 你应该用 Stonewt operator *(const Stonewt &ls,const Stonewt &rs),
另外建议少用友元函数。。你可以在全局或某一名字空间声明

3

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2009-3-8 13:44:00 | 显示全部楼层

Re:operator的问题程序

您的说法我没编译成功,仔细的看下思想和逻辑不能说不对也是模糊
此为友元编写练习
错误提示粘贴于此
error C2593: 'operator *' is ambiguous

说程序的 return ls * rs 的乘法调用不了Stonewt operator *(const Stonewt &s)const;

还有个错误同上 ..

努力在研究错误的原因,也关注楼下的回答

3

主题

9

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2009-3-8 18:33:00 | 显示全部楼层

Re:operator的问题程序

前面我的回答有错误。。
你原来算不对是因为你的成员 operator* 没有做要做的事。。。。只是按原值返回了而已,你为什么不:
return this->number * s.number;
这样你原来的也能用。

你编不过很正常!因为:
编译器在处理 t = st * d; 时
不知道是用友元的operator * 还是 成员函数 operator*

干掉你的成员函数operator* 改成:
#include<iostream>
using namespace std;

class Stonewt
{
private:
        double number;

public:
        Stonewt();
        Stonewt(double n);
        //Stonewt operator *(const Stonewt &s) const;
        friend Stonewt operator *(const Stonewt &ls,const Stonewt &rs);
        void Show()const;
};

Stonewt::Stonewt()
{
        number = 0.0;
}

Stonewt::Stonewt(double n)
{
        number = n;
}

//Stonewt Stonewt:perator *(const Stonewt &s) const
//{
//        return s;
//}

Stonewt operator *(const Stonewt &ls,const Stonewt &rs)
{
        return ls.number * rs.number;
}

void Stonewt::Show()const
{
        cout<<" * is "<<number<<endl;
}

int main(void)
{
        Stonewt st(30.0);
        Stonewt s;
        Stonewt t;
        double d = 12.0;
        s = d * st  ;
        s.Show();
        t = st * d;
        t.Show();
        return 0;
}

就OK了,或者你可以继续保留你原来的代码

3

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
 楼主| 发表于 2009-3-9 06:26:00 | 显示全部楼层

Re:operator的问题程序

恩 谢谢此代码的修改,受益非浅
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-20 04:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表