六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 45|回复: 0

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

[复制链接]

升级  18.67%

72

主题

72

主题

72

主题

举人

Rank: 3Rank: 3

积分
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++ 学习手札(三)
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表