`

C/C++ 学习手札(三)

阅读更多
接着说说友员friend和操作符重载operator,为了把这两个搞清楚,费了大半天劲儿搞了一个堆栈,被一堆指针问题搞得头都大了! 不过,最终还是OK了!

这次做这么一件事,搞体育活动。每个团队Team 有5个队员Comperitor ,可以对队员做入栈、出栈操作,每个队员有编号、名字。对输入队员信息、输出队员信息做操作符重载,使得输入的时候能够给出相应提示。

构建一个队员类Comperitor
/**
 * 队员
 */
class Comperitor {
private:
	char name[20]; //姓名
	int id; //编号
public:

	/**
	 * 取得ID
	 */
	int getId() {
		return id;
	}

	/**
	 * 设置ID
	 */
	void setId(int id) {
		this->id = id;
	}

	/**
	 * 取得名字
	 */
	char* getName() {
		return name;
	}

	/**
	 * 设置名字
	 */
	void setName(char *name) {
		strcpy(this->name, name);
	}

	/**
	 * 重载输入操作符
	 */
	friend istream & operator >>(istream & is, Comperitor & c) {
		cout << "请输入您的编号: ";
		is >> c.id;
		cout << "请输入您的姓名: ";
		is >> c.name;
		return is;
	}

	/**
	 * 重载输出操作符
	 */
	friend ostream & operator <<(ostream & os, Comperitor & c) {
		os << "编号: " << c.id << endl;
		os << "姓名: " << c.name << endl;
		return os;
	}
};

为名字赋值的时候,name我们使用的是char数组,需要通过strcpy赋值。
	/**
	 * 设置名字
	 */
	void setName(char *name) {
		strcpy(this->name, name);
	}

构建一个重载操作符,注意使用&符号,引用方式,且操作符重载必须是友员方法!
	/**
	 * 重载输入操作符
	 */
	friend istream & operator >>(istream & is, Comperitor & c) {
		cout << "请输入您的编号: ";
		is >> c.id;
		cout << "请输入您的姓名: ";
		is >> c.name;
		return is;
	}

构建一个团队类,用来控制入栈、出栈。
/**
 * 团队
 */
class Team {
private:

	/**
	 * 队员列表
	 */
	Comperitor *c[5];

	/**
	 * 当前队列指针
	 */
	int pointer;

	/**
	 * 队列上限
	 */
	int MAX;

	/**
	 * 队列下限
	 */
	int MIN;

	/**
	 * 是否为空
	 */
	bool empty;

	/**
	 * 是否为满
	 */
	bool full;
public:

	/**
	 * 空构造
	 */
	Team() {
		MAX = 5;
		MIN = 0;
		pointer = MIN;
		empty = false;
		full = false;
	}

	/**
	 * 取得当前指针
	 */
	int getPointer() {
		return pointer;
	}

	/**
	 * 队员入队
	 */
	void push() {
		// 取得当前对象指针
		Comperitor *com = new Comperitor;

		// 输入
		cin >> *com;

		// 指向置为当前输入对象
		c[pointer] = com;

		// 当前指针自 加
		pointer++;

		// 指针复位
		if (pointer >= MAX) {

			// 将当前指针指向栈顶
			pointer = MAX - 1;

			// 置为栈满
			full = true;
		}

	}

	/**
	 * 队员出队
	 */
	void pop() {
		// 取得当前对象指针
		Comperitor *com = c[pointer];

		// 输出
		cout << *com;

		// 指向置为空
		c[pointer] = NULL;

		// 当前指针自减
		pointer--;

		// 指针复位
		if (pointer < MIN) {

			// 置为栈空
			empty = true;

			// 将当前指针指向栈底
			pointer = MIN;
		}
	}

	/**
	 * 是否为空栈
	 */
	bool isEmpty() {
		return empty;
	}

	/**
	 * 是否为满栈
	 */
	bool isFull() {
		return full;
	}
};


这里要用指针数组构建队员列表
	/**
	 * 队员列表
	 */
	Comperitor *c[5];

关于指针的使用,我还解释不清楚,久远的过去了能将就用了!
看看整体的程序吧!
#include <iostream>

using namespace std;

/**
 * 队员
 */
class Comperitor {
private:
	char name[20]; //姓名
	int id; //编号
public:

	/**
	 * 取得ID
	 */
	int getId() {
		return id;
	}

	/**
	 * 设置ID
	 */
	void setId(int id) {
		this->id = id;
	}

	/**
	 * 取得名字
	 */
	char* getName() {
		return name;
	}

	/**
	 * 设置名字
	 */
	void setName(char *name) {
		strcpy(this->name, name);
	}

	/**
	 * 重载输入操作符
	 */
	friend istream & operator >>(istream & is, Comperitor & c) {
		cout << "请输入您的编号: ";
		is >> c.id;
		cout << "请输入您的姓名: ";
		is >> c.name;
		return is;
	}

	/**
	 * 重载输出操作符
	 */
	friend ostream & operator <<(ostream & os, Comperitor & c) {
		os << "编号: " << c.id << endl;
		os << "姓名: " << c.name << endl;
		return os;
	}
};

/**
 * 团队
 */
class Team {
private:

	/**
	 * 队员列表
	 */
	Comperitor *c[5];

	/**
	 * 当前队列指针
	 */
	int pointer;

	/**
	 * 队列上限
	 */
	int MAX;

	/**
	 * 队列下限
	 */
	int MIN;

	/**
	 * 是否为空
	 */
	bool empty;

	/**
	 * 是否为满
	 */
	bool full;
public:

	/**
	 * 空构造
	 */
	Team() {
		MAX = 5;
		MIN = 0;
		pointer = MIN;
		empty = false;
		full = false;
	}

	/**
	 * 取得当前指针
	 */
	int getPointer() {
		return pointer;
	}

	/**
	 * 队员入队
	 */
	void push() {
		// 取得当前对象指针
		Comperitor *com = new Comperitor;

		// 输入
		cin >> *com;

		// 指向置为当前输入对象
		c[pointer] = com;

		// 当前指针自 加
		pointer++;

		// 指针复位
		if (pointer >= MAX) {

			// 将当前指针指向栈顶
			pointer = MAX - 1;

			// 置为栈满
			full = true;
		}

	}

	/**
	 * 队员出队
	 */
	void pop() {
		// 取得当前对象指针
		Comperitor *com = c[pointer];

		// 输出
		cout << *com;

		// 指向置为空
		c[pointer] = NULL;

		// 当前指针自减
		pointer--;

		// 指针复位
		if (pointer < MIN) {

			// 置为栈空
			empty = true;

			// 将当前指针指向栈底
			pointer = MIN;
		}
	}

	/**
	 * 是否为空栈
	 */
	bool isEmpty() {
		return empty;
	}

	/**
	 * 是否为满栈
	 */
	bool isFull() {
		return full;
	}
};

/**
 * 主函数
 */
int main() {

	Team t;

	cout << endl << "队员数据输入:" << endl;
	int i = 1;
	while (!t.isFull()) {
		cout << "请输入第" << i << "位队员的信息:" << endl;
		t.push();
		i++;
	};

	cout << endl << "队员数据输出:" << endl;
	int j = t.getPointer() + 1;
	while (!t.isEmpty()) {
		cout << "第" << j << "位队员的信息:" << endl;
		t.pop();
		j--;
	};

	return 0;
}



看看操作结果:

队员数据输入:
请输入第1位队员的信息:
请输入您的编号: 1
请输入您的姓名: a
请输入第2位队员的信息:
请输入您的编号: 2
请输入您的姓名: b
请输入第3位队员的信息:
请输入您的编号: 3
请输入您的姓名: c
请输入第4位队员的信息:
请输入您的编号: 4
请输入您的姓名: d
请输入第5位队员的信息:
请输入您的编号: 5
请输入您的姓名: e

队员数据输出:
第5位队员的信息:
编号: 5
姓名: e
第4位队员的信息:
编号: 4
姓名: d
第3位队员的信息:
编号: 3
姓名: c
第2位队员的信息:
编号: 2
姓名: b
第1位队员的信息:
编号: 1
姓名: a



完成了入栈,出栈操作!


相关链接:
C/C++ 学习手札(一)
C/C++ 学习手札(二)
C/C++ 学习手札(三)
7
0
分享到:
评论
3 楼 snowolf 2009-07-03  
qinjingkai 写道
看到这里,我要说几句了!楼主功能上是实现了(push,pop,而且做到了接受键盘输入);但是我感觉好多地方不是很好;首先从类的设计角度上来说,Team里面放一个指针数组就不是很好,因为我们都知道数组是在定义的时候就必须声明要多大空间的,说的通俗一点就是要在定义的时候必须声明数组的长度,这就在很大程度上限制了程序的灵活性,带来的后果就是楼主在代码里面写的 先声明一个长度为5的数组,至于是不是5呢,不得而知了,因为程序在运行的时候用户的输入千差万别;所以我认为最好是定义成一个指针,也就是说Team里面只保存指向当前可以操作元素(也就是通常所说的栈顶元素)的指针,当pop或push时候 修改这个指针的值就可以 了;那么到底如果修改这个指针呢 就引出了第二个问题了;就是数据结构的问题了(就是Comperito的定义),如果用到栈,队列,链表这些数据结构的话,最好是每个节点元素(这里是Comperito)都包含下一个节点元素的地址(c中是指针,java中为引用),这样操作接来就非常方便;当然不用也是可以的 ,但就必须做很多额外的工作,就好比楼主那样定义一pointer,然后通过pointer的移动来实现,个人觉得这样不是很好,做了不必要的 工作! 纯属个人观点,不 要太当真!

感谢朋友的提点! 这属于学习范畴,呵呵!按照你说的操作做一个链表,当然好,我也赞同! 写上述内容的目的在于积累友员函数、操作符重载两个知识点,呵呵,这才是我的目的!感谢你的支持!关于C/C++中的指针问题,我也很迷惑。手头的问题忙完后,一定向你好好请教!
2 楼 qinjingkai 2009-07-03  
看到这里,我要说几句了!楼主功能上是实现了(push,pop,而且做到了接受键盘输入);但是我感觉好多地方不是很好;首先从类的设计角度上来说,Team里面放一个指针数组就不是很好,因为我们都知道数组是在定义的时候就必须声明要多大空间的,说的通俗一点就是要在定义的时候必须声明数组的长度,这就在很大程度上限制了程序的灵活性,带来的后果就是楼主在代码里面写的 先声明一个长度为5的数组,至于是不是5呢,不得而知了,因为程序在运行的时候用户的输入千差万别;所以我认为最好是定义成一个指针,也就是说Team里面只保存指向当前可以操作元素(也就是通常所说的栈顶元素)的指针,当pop或push时候 修改这个指针的值就可以 了;那么到底如果修改这个指针呢 就引出了第二个问题了;就是数据结构的问题了(就是Comperito的定义),如果用到栈,队列,链表这些数据结构的话,最好是每个节点元素(这里是Comperito)都包含下一个节点元素的地址(c中是指针,java中为引用),这样操作接来就非常方便;当然不用也是可以的 ,但就必须做很多额外的工作,就好比楼主那样定义一pointer,然后通过pointer的移动来实现,个人觉得这样不是很好,做了不必要的 工作! 纯属个人观点,不 要太当真!
1 楼 yinishao 2009-06-18  
还真是什么都能写!厉害!!!

相关推荐

    Perl_学习手札

    这份"Perl学习手札"是为那些想要深入理解Perl语言特性和应用的初学者或有一定经验的开发者准备的宝贵资源。 首先,Perl的核心特性在于其灵活性和表达力。Perl语法受到了C、sed、awk等多种语言的影响,这使得它在...

    perl学习手札中文

    "Perl学习手札中文"是一份专为初学者设计的学习资料,旨在帮助读者快速掌握Perl语言的基础和高级特性。以下是对这些文件内容的概览: 1. **word.css**: 这个文件可能是样式表,用于定义文档中的排版和格式。在学习...

    perl学习手札(简体中文)_简信昌

    关于作者: 简信昌 “傲尔网”专案经理 博仲法律事务所资讯部门 台北Perl推广组 (Taipei.pm) 召集人 Newzilla召集人 目前专案: Open Source Foundry (OSSF) Newzilla 线上杂志 ...“Perl学习手札”

    Perl学习手札.chm

    Perl学习手札.chmPerl学习手札.chmPerl学习手札.chm

    hibernate学习手札.z03

    hibernate学习手札.z03

    hibernate学习手札.z01

    hibernate学习手札.z01

    单片机学习过程中的学习手札

    在学习51单片机的过程中,通常需要掌握两种编程语言,即汇编语言和C语言。汇编语言能够直接与硬件交互,生成的代码效率高,但可读性和可移植性较差。而C语言在大多数情况下,生成的代码效率接近汇编,同时具有更好的...

    Perl 学习手札

    通过深入学习“Perl学习手札”,你可以系统地掌握这些概念,并逐步成长为一个熟练的Perl程序员。记住,实践是检验知识的最好方式,所以不仅要理解理论,还要动手编写代码,解决实际问题。祝你在Perl的学习之旅中取得...

    perl学习手札.CHM

    &lt;br/&gt;本资料完全来源于网上收集,对于作者并没有做过多的考证,考虑到作者本身,所以保持原作品不变只是略加整理,为用户提供一个方便的浏览方式。&lt;br/&gt;

    Spring 注解学习手札(三) 表单页面处理

    在本篇《Spring注解学习手札(三)表单页面处理》中,我们将深入探讨Spring框架中关于处理Web表单的关键注解和技术。在实际的Web开发中,表单处理是用户交互的重要组成部分,Spring提供了强大的支持,使得开发者能够...

    高级Perl编程(黑豹书)+学习手札

    "高级Perl编程(黑豹书)"和"Perl_学习手札"这两本书籍是深入理解并掌握Perl编程的重要资源。 《高级Perl编程》(黑豹书)是Perl编程领域的经典之作,它不仅适合初学者作为进阶读物,也对有经验的Perl程序员提供了...

    Spring 注解学习手札

    【Spring注解学习手札】 在现代Java Web开发中,Spring框架因其强大的功能和灵活性而备受推崇。Spring注解的引入极大地简化了配置文件,提高了开发效率。本篇将聚焦于Spring MVC中的注解,通过构建一个简单的Web...

    8086汇编学习手札及各章节检测题详细答案

    8086汇编学习手札及各章节检测题详细答案。 配套书籍 王爽的汇编

    Perl_学习手札.pdf

    ### Perl学习要点详解 #### 一、Perl简介与历史背景 Perl是一种强大的脚本语言,由Larry Wall在1987年设计并持续更新维护。它结合了C语言的强大功能和脚本语言的便捷性,使得Perl既适用于快速编写简单的脚本程序,...

    Spring 注解学习手札(二) 控制层梳理

    这篇“Spring注解学习手札(二)控制层梳理”主要聚焦于如何利用注解来构建和理解Spring MVC的控制层,即Controller。Spring MVC是Spring框架的一部分,专门用于处理Web应用程序的请求和响应。 一、@RestController...

    非常著名的perl学习手札(初学者有福了)

    ### 非常著名的Perl学习手札(初学者有福了) #### 1. 关于Perl5 **1.1 Perl的历史** Perl是由Larry Wall在1987年开发的一种高级编程语言,最初的设计目的是为了简化文本处理任务,后来发展成为一种功能强大的...

    Spring 注解学习手札(一) 构建简单Web应用

    在本篇《Spring注解学习手札(一)构建简单Web应用》中,我们将深入探讨如何使用Spring框架的注解来构建一个基本的Web应用程序。Spring框架是Java开发中的核心工具,尤其在企业级应用中广泛应用。它简化了依赖注入、...

    盟威Access快速开发平台学习手札

    ### 盟威Access快速开发平台学习手札 #### 一、引言 盟威Access快速开发平台是一款基于Microsoft Access的应用程序开发工具,旨在帮助开发者快速构建应用程序。通过使用该平台,用户无需具备复杂的编程知识就能完成...

Global site tag (gtag.js) - Google Analytics