zoukankan      html  css  js  c++  java
  • 一个简单的类模板的友元函数和友元类示例

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

    类模版 (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;
    }

    执行结果:

  • 相关阅读:
    oracle表连接------&gt;排序合并连接(Merge Sort Join)
    内存损坏问题的演示样例及分析
    HTML5 Canvas中9宫格的坑
    hive udaf 用maven打包运行create temporary function 时报错
    Re-installation failed due to different application signatures.
    UVA 6480 Zombie Invasion(模拟退火)
    POJ3436 ACM Computer Factory 【最大流】
    android图像处理系列之三--图片色调饱和度、色相、亮度处理
    android图像处理系列之四--给图片添加边框(上)
    android图像处理系列之五--给图片添加边框(中)
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7689547.html
Copyright © 2011-2022 走看看