第十四回-01 Studentクラスを作ってみよう


Student クラスを書いてみよう

テレビクラスに引続き、以下のような Student クラスを書いてみよう。

Student クラス
ID
名前
ID と名前をセット

ID 取得
名前 取得

IDと名前をコンソール表示

いつもどおり「Win32 コンソールアプリケーション」の プロジェクトを作成して欲しい。
プロジェクト名は「StudentProject」とした

作成すると、ソリューションエクスプローラーの階層構造表示は以下のようになる。
StudentProject.cpp がいつも作成している main 関数があるファイルである。

ここで、階層構造の「StudentProject」上でマウスを右クリックし、 「追加→クラス」を選択して欲しい。 現われるクラスウィザードで、クラス名を と入力「.h ファイル」と「.cpp ファイル」の部分は自動入力される

このクラス名は本来は自分の自由に決めて良いものだが、記述が面倒な部分を後でコピー&ペーストする都合上、
Student という名前で綴り間違いがないように記述すること! (先頭の S だけ大文字。大文字、小文字も区別される!)

間違いがないと思ったら「完了」ボタンをクリック。



すると、ソリューションエクスプローラーの階層構造は以下のようになる。
(Visual Studio 2019 では stdafx.cpp や stdafx.h は存在しないが、気にしなくとも良い)



それでは、以下の手順で Student クラスを記述して行こう。


ヘッダファイルを書こう

第十三回-01 におけるテレビクラスのヘッダ記述のときに触れたように、ヘッダファイルはクラス図をそのままプログラムとして記述したものと思えばよい。

ソリューションエクスプローラーの階層構造で「Student.h」をダブルクリックして記述を開始する。
一気に表示すると以下のようになる。



コピーできる形式で、必要部分を表示しよう。貼り付け場所に注意すること!

まずはクラス宣言外部の include 文と using 文。これらが何故必要かは後で述べる。

#include <string>
using namespace std;

クラスの中身、すなわち class Student(){ … }; の内部は以下のようになっているのでコピーして貼り付けて欲しい。

	int ID;
	string name;
public:
	Student(); // 引数なしのコンストラクタ
	Student(int i, string n); // 引数つきのコンストラクタ
	~Student();

	void setStudent(int i, string n);

	int getID();
	string getName();

	bool operator==(const Student& s) const; // 「等しい」ことの定義

	void printInfo();

この中で、string クラスを利用するために「#include <string>」が必要であった。
また、そのままでは string クラスは「std::string」として用いなければならないのだが、それでは繁雑になるので、
冒頭に 「using namespace std;」とか書いて「string」と省略表記できるようにした。これは第十回-01でも少し紹介した。

次に、引数つきのコンストラクタが宣言されている。これはテレビクラスでは登場せず、今回初めて用いるものである。

最後に、メンバ関数が宣言されている。途中の「operator==」は後のために必要になるのでここではあまり気にしなくともよい。

以上で、ヘッダファイルの記述は終了である。


cpp ファイルを書こう

次は、cpp ファイルである。ソリューションエクスプローラーの階層構造で「Student.cpp」をダブルクリックして記述を開始する。

Visual Studio 2019 には「#include "Student.h"」の記述しかない。 その後に以下の内容を貼り付ける。

#include <iostream>

// 引数なしのコンストラクタ
Student::Student()
{
	ID = 0;
	name = "";
}

// 引数ありのコンストラクタ
Student::Student(int i, string n)
{
	ID = i;
	name = n;
}

// デストラクタ
Student::~Student()
{
}

void Student::setStudent(int i, string n){
	ID = i;
	name = n;
}

int Student::getID(){
	return ID;
}

string Student::getName(){
	return name;
}

bool Student::operator==(const Student &s) const{
	return (ID == s.ID && name == s.name);
}

void Student::printInfo(){
	std::cout << ID << "番の学生は" << name << "\n";
}



main 関数を書こう

最後に、ソリューションエクスプローラーの階層構造でStudentProject.cpp をダブルクリックし、
Student クラスを利用する main 関数を記述して行こう。

例えば、以下のような使用例になる。

Visual Studio 2019 では、「#include "stdafx.h"」は存在しない、「_tmain(int argc, _TCHAR* argv[]」ではなく「main()」などの違いがあるが気にしなくとも良い。



記述が必要なのは、まずは冒頭の include 文。

#include "Student.h"

そして、main 関数の中身である。Student クラスの変数 (インスタンス) s1 を宣言し、ID を 100 、name を織田信長として使用している。
コメントにあるように引数なしのコンストラクタが呼ばれるため、setStudent するまでは名前などがセットされないことに注意しよう。

なお、ID は int 型で実装されているので、G100000 のように学籍番号にアルファベットを含めることはできない。
アルファベットを含めたければ int 型ではなく string 型で実装すれば良いが、今回は簡単のため int 型とした。

	Student s1;      // 引数なしコンストラクタが呼ばれる

	s1.setStudent(100,"織田信長");

	s1.printInfo();

さて、以上の準備のもとデバッグなしで開始をすると、以下のようになる。







←第十三回課題第十四回-02 Studentクラスの様々な呼び出し方→

非情報系学生のための C/C++ 入門に戻る