程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 第16章 模板與泛型編程(9)

第16章 模板與泛型編程(9)

編輯:C++入門知識

上一篇:http://www.BkJia.com/kf/201112/115030.html

16.4.2 非類型形參的模板實參

//Template1.h  
#include <string>  
using namespace std; 
 
#ifndef TEMPLATE1_H  
#define TEMPLATE1_H  
 
template <int hi, int wid> 
class Screen{ 
public: 
    Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){} 
private: 
    string screen; 
    string::size_type cursor; 
    string::size_type height,width; 
}; 
 
#include "Template1.cpp"  
#endif 
//Template1.h
#include <string>
using namespace std;

#ifndef TEMPLATE1_H
#define TEMPLATE1_H

template <int hi, int wid>
class Screen{
public:
 Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
 string screen;
 string::size_type cursor;
 string::size_type height,width;
};

#include "Template1.cpp"
#endif//CP.cpp  
Screen<100,200> hp; 
 //CP.cpp
 Screen<100,200> hp;非類型模板實參必須是編譯時常量表達式。

16.4.3 類模板中的友元聲明

在類模板中可以出現三種友元聲明:

(1)普通非模板類或函數的友元聲明,將友元關系授予明確指定的類或函數。

(2)類模板或函數模板的友元聲明,授予對友元所有實例的訪問權。

(3)只授予對類模板或函數模板的特定實例的訪問權的友元聲明。

1. 普通友元

非模板類或非模板函數可以是類模板的友元。

template <int hi, int wid> 
class Screen{ 
public: 
    Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){} 
private: 
    string screen; 
    string::size_type cursor; 
    string::size_type height,width; 
    friend class Base; 
}; 
template <int hi, int wid>
class Screen{
public:
 Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
 string screen;
 string::size_type cursor;
 string::size_type height,width;
 friend class Base;
};
2. 一般模板友元關系

#include <string>  
#include "Class.h"  
#include "Queue.h"  
using namespace std; 
 
template <int hi, int wid> 
class Screen{ 
public: 
    Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){} 
private: 
    string screen; 
    string::size_type cursor; 
    string::size_type height,width; 
    template<class Type> friend class Queue; 
}; 
#include <string>
#include "Class.h"
#include "Queue.h"
using namespace std;

template <int hi, int wid>
class Screen{
public:
 Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
 string screen;
 string::size_type cursor;
 string::size_type height,width;
 template<class Type> friend class Queue;
};友元可以是類模板或函數模板。

3. 特定的模板友元關系

除了將一個模板的所有實例設為友元,類也可以只授予對特定實例的訪問權。

#include <string>  
#include "Class.h"  
#include "Queue.h"  
using namespace std; 
 
template <int hi, int wid, class Type> 
class Screen{ 
public: 
    Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){} 
private: 
    string screen; 
    string::size_type cursor; 
    string::size_type height,width; 
    friend class Queue<Type>; 
}; 
#include <string>
#include "Class.h"
#include "Queue.h"
using namespace std;

template <int hi, int wid, class Type>
class Screen{
public:
 Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
 string screen;
 string::size_type cursor;
 string::size_type height,width;
 friend class Queue<Type>;
};4. 聲明依賴性

當授予對給定模板的所有實例的訪問權的時候,在作用域中不需要存在該類模板或函數模板的聲明。實際上,編譯器將友元聲明也當作類或函數的聲明對待。

想要限定對特定實例化的友元關系時,必須在可以用於友元聲明之前聲明類或函數。

#include <string>  
#include "Class.h"  
using namespace std; 
 
template <int hi, int wid> 
class Screen{ 
public: 
    Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){} 
private: 
    string screen; 
    string::size_type cursor; 
    string::size_type height,width; 
    template<class Type> friend class Queue; 
}; 
#include <string>
#include "Class.h"
using namespace std;

template <int hi, int wid>
class Screen{
public:
 Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}
private:
 string screen;
 string::size_type cursor;
 string::size_type height,width;
 template<class Type> friend class Queue;
};

 摘自 xufei96的專欄
 


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved