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


それから友达について話します.
friendとオペレータの再ロード
Operator、この2つを明らかにするために、長い間苦労してスタックを作ったが、ポインタの問題で頭が大きくなった.でも、結局OK!
今度はこんなことをして、スポーツをします.各チームチームチームには5人の選手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++学習手札(三)