• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
渴爱网のWebMaster 's Blog【Welcome to my website : KIIK.TOP 】
Go ahead man ! I just wanna achieve what i wanted man.
Tips:1.Do a excellent programmer who can hacking and build awesome program
     2.Became a designer who can make everything which nearby me looks like so charming.
博客园    首页    新随笔    联系   管理    订阅  订阅

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++编译器编译成功。

 

我个人建议还是使用一。

 

posted @ 2019-04-12 15:48  kiik  阅读(976)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3