【C++ Primer】第十五章 友元、异常和其他 --之一--->友元和嵌套类

原创 2012年03月27日 19:57:05

一,友元

       1)可以将类作为友元,友元类的所有方法都可以访问原始类的私有成员和保护成员。

       2)下面例子介绍了 电视类和遥控器类,其中遥控器类为电视类的友元类

       3)注意:友元关系不具对称性。即 A 是 B 的友元,但 B 不一定是 A 的友元。 友元关系不具传递性。即 B 是 A 的友元,C 是 B 的友元,但是 C 不一定是 A 的友元。

#include <iostream>
using namespace std;
class TV
{
private:
	int state;// on or off
	int volume; //assumed to be digitized
	int maxchannel;// maximum number of channels
	int channel;//current channel settings
	int mode;//broadcast  or  cable
	int input;//tv or vcr
public:
	friend class Remote;//遥控器类
	enum{off,on}; //枚举
	enum{minval,maxval=20};
	enum{antenna,cable};
	enum{tv,vcr};
	
	TV(int s=off,int mc=100):state(s),volume(5),maxchannel(mc),channel(2),mode(cable),input(tv){} //构造函数
	
	void onoff(){
		state=(state == on)?off:on;
	}	
	bool ison()const{
		return state == on;
	}
	bool volup();
	bool voldown();
	void chanup();
	void chandown();
	void set_mode(){
		mode = (mode == antenna)?cable:antenna; 
	} 
	void set_input(){
		input=(input == tv)?vcr:tv;
	}
	void settings()const;
} ;

class Remote//遥控器友元类
{
private:
	int mode;
public:
	Remote(int m=TV::tv):mode(m){} //遥控的是电视而不是 vcr
	bool volup(TV &t){  //遥控器的操作都是来源于电视对自身的操作 ,所以友元遥控器的方法都是调用电视的成员函数
		return t.volup();
	}	
	bool voldown(TV &t){
		return t.voldown();
	}
	void onoff(TV &t){
		return t.onoff();
	}
	void chanup(TV &t){
		return t.chanup();
	}
	void chandown(TV &t){
		return t.chandown();
	}
	void set_chan(TV &t,int c){  //唯一需要作为友元的方法,因为它用来访问TV类的private成员
		t.channel=c;
	}
	void set_mode(TV &t){
		t.set_mode();
	}
	void et_input(TV &t){
		t.set_input();
	}
	
};
    /*下面是电视的成员方法实现*/
    bool TV::volup()
    {
    	if(volume<maxval)
    	{
	    	volume++;
	    	return true;
	    }
	    else
         	return false;
    }
	bool TV::voldown()
	{
		if(volume>minval)
    	{
	    	volume--;
	    	return true;
	    }
	    else
         	return false;
		
	}
	void TV::chanup()
	{
		if(channel<maxchannel)
		  channel++;
	    else
		  channel=1;
		
	}
	void TV::chandown()
	{
		if(channel>1)
		  channel--;
	    else
		  channel=maxchannel;
		
	}
	void TV::settings()const
	{
		cout<<"tv is "<<(state == off?"on":"off")<<endl;
		if(state == on)
		{
			cout<<"volume setting ="<<volume<<endl;
			cout<<"channel setting ="<<channel<<endl;
			cout<<"Mode ="<<(mode == antenna?"cable":"antenna")<<endl;
			cout<<"Input ="<<(input == tv?"vcr":"tv")<<endl;
		}
		
	}
	
int main()
{
	TV s27;
	cout<<"initinal settings for 27\" tv:\n";
	s27.settings();
	s27.onoff();
	s27.chanup();
	cout<<"adjust settings for 27\"tv:";
	s27.settings();
	
	
	return 0;
}
输出为:

二,嵌套类

       1)嵌套与包含的区别

             包含意味着将类对象作为另一个类的成员

             对类进行嵌套,不创建类成员,而是定义了一种类型,该类型仅在包含嵌套类的类中使用。struct (结构)实际上是一种嵌套类

        2)嵌套类和访问权限

声明位置 包含它的类是否可以使用 从包含它的类派生出来的类,是否可以使用 外部世界是否可以使用
私有部分
保护部分
共有部分


TV模型图像修复

转自:http://www.cnblogs.com/tiandsp/archive/2013/05/31/3110350.html 曾经想要实现过Bertalmio图像修复算法,无奈自身实力不够...
  • rookiew
  • rookiew
  • 2015年03月01日 18:11
  • 1328

AndroidTV开发教程(1)

AndroidTV应用开发简介目前,网上还没有对AndroidTV的足够的介绍。在本系列教程中,将介绍如何开发AndroidTV应用程序。此篇文章的主要目的是了解AndroidTV的UI实现。...
  • aa2967277
  • aa2967277
  • 2016年02月01日 11:29
  • 6680

Android TV开发总结(一)构建一个TV app前要知道的事儿

前言:近年来,智能电视的发展如火如荼,Googel 也在大力推进TV及穿带设备的发展,在互联网的风口,是猪也会飞,这句话并不是没有道理的。传统电视机厂商,基本都转型致力于智能电视的相关业务,今天的Ag...
  • hejjunlin
  • hejjunlin
  • 2016年10月12日 07:33
  • 16724

Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑

Android TV 开发与一般Android开发最大的区别在于焦点控制 , 用户在使用Android TV设备主要是通过遥控器操作app。焦点就是让用户知道的直接交互行为。 然而一些app,依据系统...
  • hejjunlin
  • hejjunlin
  • 2016年10月17日 19:26
  • 7102

东半球最好的TV桌面开源项目

欢迎在GitHub或者CSDN上关注我GitHub: https://github.com/JackyAndroidCSDN: http://blog.csdn.net/rain_butterflyA...
  • rain_butterfly
  • rain_butterfly
  • 2015年04月08日 16:30
  • 11400

Android TV 开发有关PopupWindow的KeyListener(手机也能用)

转载请标明原地址:http://blog.csdn.net/gaolei1201/article/details/38586851                现在这个公司主要是做智能电视视频方面。...
  • gaolei1201
  • gaolei1201
  • 2014年08月15日 16:11
  • 1597

[TV] Android中Framework层TV部分的定制化

一直在研究公司Android TV的整个架构,整个APK、Framework、Native Lib都有初步的掌握,不过由于之前Linux TV平台的项目和Android TV 的架构在中间层都是一样 ...
  • ysh149216447
  • ysh149216447
  • 2015年05月10日 18:17
  • 927

基于TV模型的image inpainting算法

基于TV模型的图像修复算法
  • seatonqiu
  • seatonqiu
  • 2017年05月05日 14:35
  • 891

Android TV APPs 的介绍与创建

最近开始接触到Andorid TV编程,发现目前这方便的资料与比较还比较少,但现在随着产品与用户的升级,涉及到Android TV与 Android Watch的编程离我们越来越近了,本篇博客开始,将...
  • zhanggang740
  • zhanggang740
  • 2016年07月19日 18:00
  • 8064

Android TV填坑之旅(二)--VIEWPAGER的使用(包括循环播放)

当Android中想呈现幻灯片效果时,会想到使用VIEWPAGER加载图片呈现出来,实际操作的过程中坑无数,这里记录一下。...
  • yangchengtest
  • yangchengtest
  • 2016年12月02日 10:10
  • 968
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【C++ Primer】第十五章 友元、异常和其他 --之一--->友元和嵌套类
举报原因:
原因补充:

(最多只允许输入30个字)