注册 登录
编程论坛 C++教室

高手帮我看看模板类下重载加法的问题

hagunamatata 发布于 2009-07-17 20:37, 753 次点击
#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;
}
第一次编这个,高手 帮忙看看加法重载那边有什么问题,谢谢了
5 回复
#2
HD_MC_HRL2009-07-17 22:36
#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;
}
帮你改动了下。。
#3
hagunamatata2009-07-17 22:42
谢谢呀,那可以直接与一个浮点数数相加吗?
#4
HD_MC_HRL2009-07-18 12:00
可以,我没用你的重载<<,都可以的。
#5
pangding2009-07-18 12:08
以下是引用hagunamatata在2009-7-17 22:42的发言:

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

一个向量和一个浮点数相加是什么意思?
#6
apple7533572009-07-18 23:46
#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函数,因为它权限太高,会失去数据安全和层次性。
1