一个简单的类模板的友元函数和友元类示例

一个简单的类模板的友元函数和友元类示例

 

类模版 (class template)说明的是该类是一个模版,它代表的是整个类家族的参数化描述。
模版类 (template class)通常被用于下面几个方面:
(1)作为类模版的同义词
(2)从模版产生类
(3)具有一个template-id名称的类。(template-id指的是模版名称与紧随其后的尖括号内部的所有实参的组合)
第二个和第三个含义区别是很细微的,它们的这些区别无关紧要。
通常使用的是 类模版。就像常使用 函数模版,而不是模版函数。

 

方式一:

#include <iostream>

template <typename T>
class myclass
{
public:
    myclass(T t1, T t2): x(t1), y(t2)
    {

    }

    template <typename Q>
    friend void print(myclass<Q> & my);

    template <typename Q>
    friend myclass<Q> * operator +(const myclass<Q> &my1, const myclass<Q> &my2);

    template <typename Q>
    friend class runclass;

private:
    T x;
    T y;
};

template <typename Q>
void print(myclass<Q> & my)
{
    std::cout << "x: " << my.x << " y: " << my.y << std::endl;
}

template <typename Q>
myclass<Q> * operator +(const myclass<Q> &my1, const myclass<Q> &my2)
{
    myclass<Q> *p = new myclass<Q>(my1.x+my2.x, my1.y+my2.y);
    return p;
}

template <typename Q>
class runclass
{
public:
    runclass(Q i): sum(i)
    {

    }

    void calcSum(const myclass<Q> &my)
    {
        sum += my.x + my.y;
    }

    void cleanSum()
    {
        sum = 0;
    }

    void printSum()
    {
        std::cout << "sum: " << sum << std::endl;
    }

private:
    Q sum;
};


int main()
{
    myclass<int> my1(19,29);
    print(my1);
    myclass<int> my2(30,90);
    print(my2);

    myclass<int> *pclass = my1 + my2;
    print(*pclass);
    delete pclass;

    runclass<int> run1(0);
    run1.calcSum(my1);
    run1.calcSum(my2);
    run1.printSum();
    run1.cleanSum();
    run1.printSum();

    system("pause");
    return 0;
}

 

执行结果:

 

 

方式二:

 

#include <iostream>

// 改动一:增加函数模板的声明——而这又需要先声明类模板
template <typename T>
class myclass;

template <typename T>
void print(myclass<T> & my);

template <typename T>
myclass<T> * operator +(const myclass<T> &my1, const myclass<T> &my2);

template <typename T>
class runclass;

template <typename T>
class myclass
{
public:
    myclass(T t1, T t2): x(t1), y(t2)
    {

    }
    // 改动二:在函数名后面加上<>,指明它是之前声明的函数模板的实例
    friend void print<T>(myclass<T> & my);
    friend myclass<T> * operator +<T>(const myclass<T> &my1, const myclass<T> &my2);
    friend class runclass<T>;

private:
    T x;
    T y;
};

template <typename T>
void print(myclass<T> & my)
{
    std::cout << "x: " << my.x << " y: " << my.y << std::endl;
}

template <typename T>
myclass<T> * operator +(const myclass<T> &my1, const myclass<T> &my2)
{
    myclass<T> *p = new myclass<T>(my1.x+my2.x, my1.y+my2.y);
    return p;
}

template <typename T>
class runclass
{
public:
    runclass(T i): sum(i)
    {

    }

    void calcSum(const myclass<T> &my)
    {
        sum += my.x + my.y;
    }

    void cleanSum()
    {
        sum = 0;
    }

    void printSum()
    {
        std::cout << "sum: " << sum << std::endl;
    }

private:
    T sum;
};

int main()
{
    myclass<int> my1(19,29);
    print(my1);
    myclass<int> my2(30,90);
    print(my2);

    myclass<int> *pclass = my1 + my2;
    print(*pclass);
    delete pclass;

    runclass<int> run1(0);
    run1.calcSum(my1);
    run1.calcSum(my2);
    run1.printSum();
    run1.cleanSum();
    run1.printSum();

    system("pause");
    return 0;
}

 

执行结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值