欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c/c++ 模板与STL小例子系列<二> 模板类与友元函数

程序员文章站 2022-05-04 14:03:41
c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator实现这样的友元需要3个必要步骤 1,在模板类D的实现代码的上面声明友元函数 2,在模板类D的实现代码里面声明它是我的友元 3,实现友元函数 c++ include using name ......

c/c++ 模板与stl小例子系列<二> 模板类与友元函数

比如某个类是个模板类d,有个需求是需要重载d的operator<<函数,这时就需要用到友元。

实现这样的友元需要3个必要步骤

1,在模板类d的实现代码的上面声明友元函数

template<typename> class d;//因为友元函数的参数里使用了d,所以要先在这里声明一下
template<typename t>
ostream& operator<< (ostream&, const d<t> &);

2,在模板类d的实现代码里面声明它是我的友元

//注意operator<<后面有<t>                                                  
friend ostream& operator<< <t>(ostream& ,const d<t>&);

3,实现友元函数

template<typename t>
//注意operator<<后面没有<t> 
ostream& operator << (ostream& out,const d<t>& d){
  out << d.x;
  return out;
}

例子代码:

#include <iostream>
using namespace std;

template<typename t>
class test{
public:
  test(t t) : data(t){}
  virtual void show() = 0;
private:
  t data;
};

template<typename> class d;
template<typename t>
ostream& operator<< (ostream&, const d<t> &);

template<typename t>
class d : public test<t>{
  //注意有<t>                                                  
  friend ostream& operator<< <t>(ostream& ,const d<t>&);
public:

  //注意不是test(t1)                                           
  d(t t1, t t2) : test<t>(t1), x(t2){}
  void show(){
    cout << x << ", " << x << endl;
  }
private:
  t x;
};

template<typename t>
ostream& operator << (ostream& out,const d<t>& d){
  out << d.x;
  return out;
}

int main(void){
  test<int> *p = new d<int>(10, 21);
  p->show();
  d<int> d(10,20);
  cout << d << endl;
  return 0;
}

模板类继承非模板类,非模板类继承模板类

下面的例子没有什么实际意义,只看语法。

#include <iostream>
using namespace std;

class foo{
public:
  foo(int a, int b, int c) : x(a), y(b), z(c){}
  void show(){
    cout << x << "," << y << "," << z << endl;
  }
private:
  int x, y, z;
};

template <typename t>
class goo : public foo{
public:
  goo(t t, int a, int b, int c):foo(a,b,c), data(t){}
  void show(){
    cout << data << endl;
    cout << "goo show" << endl;
  }
private:
  t data;
};

class hoo : public goo<int>{
public:
  hoo(int a1,int a2,int a3,int a4,int a5):
    goo(a1,a2,a3,a4),ho(a5){}
  void show(){
    cout << "hoo show" << endl;
  }
private:
  int ho;
};
int main(void){
  hoo hoo(1,2,3,4,5);
  hoo.show();
  goo<string> goo("abc",1,2,3);
  goo.show();
  return 0;
}