当前位置:编程学习 > C/C++ >>

第16章 模板与泛型编程(9)

上一篇:http://www.zzzyk.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的专栏
 


 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,