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 

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++ 学习手札(三)

转载于:https://my.oschina.net/mohaiyong/blog/221287

你可能感兴趣的:(c/c++)