码迷,mamicode.com
首页 > 编程语言 > 详细

c++ 模板类的 友元函数

时间:2017-10-17 23:04:20      阅读:419      评论:0      收藏:0      [点我收藏+]

标签:功能   std   ons   code   nbsp   empty   []   max   nullptr   

  1 #pragma once
  2 #include <iostream>
  3 
  4 template <class T>
  5 class stack
  6 {
  7     template <class Ty>
  8     friend std::ostream& operator<<(std::ostream& os, const stack<Ty>& s);
  9 public:
 10     explicit stack<T>(int maxSize);
 11     stack<T>(const stack<T>& s);
 12     stack<T>(stack<T>&&) = delete;
 13     stack<T>& operator=(const stack& s);
 14     stack<T>& operator=(stack<T>&&) = delete;
 15     ~stack<T>();
 16 
 17     void push(T e);
 18     bool pop(T& e);
 19     bool getTop(T& e) const;
 20 
 21     bool isEmpty() const;
 22     int getNumElems() const;
 23 
 24 private:
 25     T* elems;
 26     int top;
 27     int maxSize;
 28     void overflowProcess();
 29 };
 30 
 31 template <class T>
 32 std::ostream& operator<<(std::ostream& os,const stack<T>& s)
 33 {
 34     for (int i = 0; i <= s.top; i++)
 35     {
 36         std::cout << s.elems[i] << " ";
 37     }
 38     return os;
 39 }
 40 
 41 template <class T>
 42 stack<T>::stack(int maxSize_): top(-1), maxSize(maxSize_)
 43 {
 44     this->elems = new T[this->maxSize];
 45 }
 46 
 47 template <class T>
 48 stack<T>::stack(const stack<T>& s)
 49 {
 50     this->top = s.top;
 51     this->maxSize = s.maxSize;
 52     this->elems = new T[this->maxSize];
 53     memcpy_s(this->elems, sizeof(T) * maxSize, s.elems, sizeof(T) * maxSize);
 54 }
 55 
 56 template <class T>
 57 stack<T>& stack<T>::operator=(const stack& s)
 58 {
 59     if (this == &s) return *this;
 60     if (this->elems != nullptr)delete[] elems;
 61     this->top = s.top;
 62     this->maxSize = s.maxSize;
 63     this->elems = new T[maxSize];
 64     memcpy_s(this->elems, sizeof(T) * maxSize, s.elems, sizeof(T) * maxSize);
 65     return *this;
 66 }
 67 
 68 template <class T>
 69 stack<T>::~stack()
 70 {
 71     if (this->elems != nullptr)
 72         delete[] elems;
 73 }
 74 
 75 template <class T>
 76 void stack<T>::push(T e)
 77 {
 78     if (this->top == maxSize - 1)
 79     {
 80         overflowProcess();
 81     }
 82     this->elems[++top] = e;
 83 }
 84 
 85 template <class T>
 86 bool stack<T>::pop(T& e)
 87 {
 88     if (!isEmpty())
 89     {
 90         e = this->elems[top--];
 91         return true;
 92     }
 93     return false;
 94 }
 95 
 96 template <class T>
 97 bool stack<T>::getTop(T& e) const
 98 {
 99     if (!isEmpty())
100     {
101         e = elems[top];
102         return true;
103     }
104     return false;
105 }
106 
107 template <class T>
108 bool stack<T>::isEmpty() const
109 {
110     return top == -1 ? true : false;
111 }
112 
113 template <class T>
114 int stack<T>::getNumElems() const
115 {
116     return top + 1;
117 }
118 
119 template <class T>
120 void stack<T>::overflowProcess()
121 {
122     T* new_elems = new T[maxSize + maxSize / 3];
123     memcpy_s(new_elems, sizeof(T) * maxSize, this->elems, sizeof(T) * maxSize);
124     delete[] elems;
125     this->elems = new_elems;
126 }

代码长;懒得剪。。。。一个具备基本功能的栈类;可以直接使用

里面用到了:  模板友元函数   在类外定义的前面要加上template<class Ty> 以示区分

因此:  模板友元函数:类内定义       无需 template<class Ty>  /////其实这个还不确定,下次试试就知道了

                                     类内声明,类外定义:需要tempalte<class Ty> 

          

c++ 模板类的 友元函数

标签:功能   std   ons   code   nbsp   empty   []   max   nullptr   

原文地址:http://www.cnblogs.com/infoo/p/7684209.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!