接著說說友員friend和操作符重載operator,為了把這兩個搞清楚,費了大半天勁兒搞了一個堆棧,被一堆指針問題搞得頭都大了! 不過,最終還是OK了!
這次做這麼一件事,搞體育活動。每個團隊Team 有5個隊員Comperitor ,可以對隊員做入棧、出棧操作,每個隊員有編號、名字。對輸入隊員信息、輸出隊員信息做操作符重載,使得輸入的時候能夠給出相應提示。
構建一個隊員類Comperitor
C++代碼
/**
* 隊員
*/
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
完成了入棧,出棧操作!