zoukankan      html  css  js  c++  java
  • C++模板类中友元函数的写法

    首先,已声明好的类Triangle

    file://Triangle.h
    
    template<class T>
    class Triangle{
    public:
        Triangle(T width,T height);
    private:
        T width;
        T height;
    };

    再在Triangle.hpp内补全构造函数

    file://Triangle.hpp
    
    template<class T>
    Triangle<T>::Triangle(T width,T height){
        this->width=width;
        this->height=height;
    }

    ------------------------------------------------------------------------

      以上为准备工作,接下来才是主要内容

    ----------------------------------------------------------------------

    一.GCC与VC++都可以编译成功的版本

    1.友元函数为重载函数

    操作流程:

    1) 在模板内添加友元函数声明(记住:因为友元函数也是函数模板,所以需要在函数名后加<T>)

    file://Triangle.h
    
    template<class T>
    class Triangle{
    public:
        Triangle(T width,T height);
      friend ostream& operator<<<T>(ostream& os,Triangle<T>& t);
    private: T width; T height; };

    2)定义友元函数

    file://Triangle.hpp
    
    template<class T> //这个T可以为其他代号 因为这是一个崭新的函数模板
    ostream& operator<<(ostream& os,Triangle<T>& t){
        os<<"高度为"<<t.height<<"宽度为"<<t.width;
        return os;
    }

    2.普通友元函数

    操作流程一共三步,第一步是在类模板定义前声明类模板和友元函数的函数模板,接下来两部与友元重载函数的两部一致

    1)声明类模板和友元函数的函数模板+2)类模板内部声明友元函数

    file://Triangle.h
    
    template <class T> class Triangle;
    template <class T> void showSize(Triangle<T>& t);
    
    template<class T>
    class Triangle{
    public:
        Triangle(T width,T height);
        friend void showSize<T>(Triangle<T>& t);
    private:
        T width;
        T height;
    };

    3)定义友元函数的函数模板

    file://Triangle.hpp
    
    template<class T>
    void showSize(Triangle<T>& t){
        cout<<"the size of triangle is "<<t.width*t.height/2<<" square."<<endl;

    总结:

    重载函数与一般友元函数的写法区别:如果是模板类中的普通友元函数,那需要在模板类定义前声明一下模板类以及模板函数,如果是重载函数则不需要。

    二.只有VC++编译器可以编译成功的版本

    如果你使用的是VS这种IDE,那么不用管是一般友元函数还是重载函数 ,写法都一样

    1)现在模板类中声明友元函数

    file://Triangle.h
    
    template<class T>
    class Triangle{
    public:
        Triangle(T width,T height);
        template<class T>
        friend ostream& operator<<(ostream& os,Triangle<T>& t);
        template<class T>
        friend void showSize(Triangle<T>& t);
    private:
        T width;
        T height;
    };

    2)定义(定义与 一. 中一致,这里就不写了)

    整体总结,

    一,优点:多种c++编译器都可以编译成功。缺点,一般友元函数写法与友元重载函数写法不同

    二,优点:友元函数写法就一种。缺点,只可以在vs上的vc++编译器编译成功。

    我个人建议还是使用一。

  • 相关阅读:
    上学要迟到了【最短路转化】
    解方程【狄利克雷卷积+莫比乌斯反演+积性函数】
    FFT
    min25 筛
    Easy【生成函数】
    CF1406D-Three Sequences
    Alice和Bob赌糖果【赌徒破产模型】
    记MySQL自增主键修改无效的问题
    JVM学习笔记(十一、JDK分析工具)
    JVM学习笔记(十、GC3-垃圾回收机制)
  • 原文地址:https://www.cnblogs.com/kiik/p/how_to_coding_friend_function_in_cpp_template_class.html
Copyright © 2011-2022 走看看