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;
    }

    执行结果:

  • 相关阅读:
    新词发现
    隐马尔可夫模型
    nodejs命令行解析工具之minimist
    react 生命周期
    react 中的 super super(props)
    object 常用方法总结
    前端安全 中间人攻击
    Postgresql的临时表的用法
    windows下postgresql数据库备份和还原
    PostgreSQL 数据库开发规范——命名规范 & 设计规范
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7689547.html
Copyright © 2011-2022 走看看