标题:高手帮我看看模板类下重载加法的问题
只看楼主
hagunamatata
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-7-16
结帖率:100%
已结贴  问题点数:20 回复次数:5 
高手帮我看看模板类下重载加法的问题
#include<iostream>
using namespace std;
template<typename T>
class Vec3
{
private:
    T x;
    T y;
    T z;
public:
    T GetX()const{return x;}
    T GetY()const{return y;}
    T GetZ()const{return z;}
    
    Vec3(T a,T b,T c):x(a),y(b),z(c){}

    friend ostream& operator<<(ostream& out,Vec3<T>& r)
    {
        out<<"("r.GetX()<<","<<GetY()<<","<<GetZ()<<")";
        return out;
    }
    friend Vec3 operator+(float& t,Vec3<T>& r)
    {
      return Vec3(t+r.GetX(),t+r.GetY(),t+r.GetZ());
    }
};
void main()
{
    Vec3<double>a(1,2,3);
    Vec3<double>b(3,4,5);
    cout<<a+b;
}
第一次编这个,高手 帮忙看看加法重载那边有什么问题,谢谢了
搜索更多相关主题的帖子: 加法 模板 重载 救命 
2009-07-17 20:37
HD_MC_HRL
Rank: 2
等 级:论坛游民
帖 子:4
专家分:15
注 册:2009-6-4
得分:10 
#include<iostream.h>
template<typename T>
class Vec3
{
private:
    T x;
    T y;
    T z;
public:
    T GetX()const{return x;}
    T GetY()const{return y;}
    T GetZ()const{return z;}
   
    Vec3(T a,T b,T c):x(a),y(b),z(c){cout<<"a"<<a<<'\t'<<"b"<<b<<'\t'<<"c"<<c<<endl;}

    friend ostream& operator<<(ostream& out,Vec3<T>& r)
    {
        out<<"("r.GetX()<<","<<GetY()<<","<<GetZ()<<")";
        return out;
    }
    friend Vec3 operator+(Vec3<typename T>x,Vec3<typename T>y)
    {
      return Vec3(x.GetX()+y.GetX(),x.GetY()+y.GetY(),x.GetZ()+y.GetZ());
    }
};
void main()
{
    Vec3<double>a(1,2,3);
    Vec3<double>b(3,4,5);
    a+b;
}
帮你改动了下。。
2009-07-17 22:36
hagunamatata
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2009-7-16
得分:0 
谢谢呀,那可以直接与一个浮点数数相加吗?
2009-07-17 22:42
HD_MC_HRL
Rank: 2
等 级:论坛游民
帖 子:4
专家分:15
注 册:2009-6-4
得分:0 
可以,我没用你的重载<<,都可以的。
2009-07-18 12:00
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
以下是引用hagunamatata在2009-7-17 22:42的发言:

谢谢呀,那可以直接与一个浮点数数相加吗?

一个向量和一个浮点数相加是什么意思?
2009-07-18 12:08
apple753357
Rank: 2
等 级:论坛游民
帖 子:5
专家分:10
注 册:2009-7-1
得分:10 
#include<iostream>
using namespace std;
template<typename T>
class Vec3 {
private:
    T x;
    T y;
    T z;
public:
    Vec3(T a,T b,T c):x(a),y(b),z(c){}
    Vec3():x(0),y(0),z(0){}
    T GetX() const {return x;}
    T GetY() const {return y;}
    T GetZ() const {return z;}

    Vec3 operator+(const Vec3<T>& r) { x += r.GetX(); y += r.GetY(); z += r.GetZ(); return *this; }
};

template<class U> ostream& operator<<(ostream& out, const Vec3<U>& r) {
    out<< "(" << r.GetX() << ","<< r.GetY() << "," << r.GetZ() <<")";
    return out;
}

template<class U> Vec3<U> operator+(const U& r, const Vec3<U>& h) {
    Vec3<U> tmp(r,r,r);
    return tmp + h;
}

template<class U> Vec3<U> operator+(const Vec3<U>& h, const U& r) {
    Vec3<U> tmp(r,r,r);
    return tmp + h;
}

int main() {
    Vec3<double> a(1,2,3);
    Vec3<double> b(3,4,5);
    cout << 2.0 + a + b + 5.0;
}


一般来说不要随便定义friend函数,因为它权限太高,会失去数据安全和层次性。
2009-07-18 23:46



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-279716-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039468 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved