设为首页
优惠IDC
收藏本站
六狼博客
六狼论坛
开启辅助访问
切换到窄版
用户名
Email
自动登录
找回密码
密码
登录
立即注册
只需一步,快速开始
只需一步,快速开始
快捷导航
门户
首页
BBS
云计算
大数据
手机
移动开发android,ios,windows phone,windows mobile
编程
编程技术java,php,python,delphi,ruby,c,c++
前端
WEB前端htmlcss,javascript,jquery,html5
数据库
数据库开发Access,mysql,oracle,sql server,MongoDB
系统
操作系统windows,linux,unix,os,RedHat,tomcat
架构
项目管理
软件设计,架构设计,面向对象,设计模式,项目管理
企业
服务
运维实战
神马
搜索
搜索
热搜:
php
java
python
ruby
hadoop
sphinx
solr
ios
android
windows
centos
本版
帖子
用户
六狼论坛
»
首页
›
操作系统
›
os
›
C/C++ 学习手札(三)
返回列表
查看:
45
|
回复:
0
C/C++ 学习手札(三)
[复制链接]
snowolf
snowolf
当前离线
积分
256
窥视卡
雷达卡
升级
18.67%
当前用户组为
举人
当前积分为
256
, 升到下一级还需要 244 点。
72
主题
72
主题
72
主题
举人
举人, 积分 256, 距离下一级还需 244 积分
举人, 积分 256, 距离下一级还需 244 积分
积分
256
发消息
楼主
|
发表于 2013-1-15 02:55:51
|
显示全部楼层
|
阅读模式
接着说说友员
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++ 学习手札(三)
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2008-2020
六狼论坛
(http://it.6wolf.com) 版权所有 All Rights Reserved.
Powered by
Discuz!
X3.4
京ICP备14020293号-2
本网站内容均收集于互联网,如有问题请联系
QQ:389897944
予以删除
快速回复
返回顶部
返回列表