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

    执行结果:

  • 相关阅读:
    C++面向对象笔记:继承、派生
    教你制作伪静态
    安装android环境别忘了加个环境变量sdk_home
    javascript获取asp.net后台代码的方法
    一天学会PHP(转)
    access数据库里面用sql语句随机调用一条数据
    【转】 android sdk setup时出现:HTTPS SSL error , Server:10.159.192.62
    AutoCode下载及具体使用方法
    讲故事谈.NET委托:一个C#睡前的故事
    使用activeskin控件制作VB和易语言的皮肤的视频教程
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/7689547.html
Copyright © 2011-2022 走看看