TNP資料室 @ ウィキ

構造体に関数書く

最終更新:

kokeiro

- view
だれでも歓迎! 編集

構造体に関数を書く

 これは本来C++の機能なのか?よく分からないけど少なくともC++ではこの機能が実装されています。基盤で使用している機能を中心に説明します。本来は継承やら多様性やらアクセス指定子やらコンストラクタやらデストラクタやらやたら機能が多いのです。気になったら調べてみてください。

C++での構造体の定義と宣言の仕方について

 関数に関することを説明することの前に、C++での構造体の実体宣言の仕方を紹介します。Cの書き方でもサポートされていますが、何かとC++のほうが高機能です(関数の引数に使用するときなど)。

Cの構造体定義と宣言

#include<stdio.h>
struct SScore{		// struct Scoreの略
	int japanese;	// 日本語の点数
	int math;	// 数学の
	int english;	// 英語の
};
int main (){
	struct SScore Score;	// 構造体定義名の前に「struct」が必要
	return 0;
}

C++の構造体定義と宣言

#include<stdio.h>
struct SScore{		// struct Scoreの略
	int japanese;	// 日本語の点数
	int math;	// 数学の
	int english;	// 英語の
};
int main (){
	SScore Score;	// 構造体定義名の前に「struct」がいらない
	return 0;
}

 こんな違いがあります。後者のほうが記述も簡単ですし、私はそちらを使用しています。C言語の場合でもtypedefの機能を使えばstructの省略が可能になりますが、関数の引数として構造体を渡そうとしたときなどに制約が出ます。

構造体に関数を定義する

 多くの場合、構造体の定義には関数のプロトタイプ宣言を記述します。関数の定義は別の場所に書きます。関数の定義を書くときは、スコープ解決演算子というものを使用します。名前はどうでもいいので、記述の仕方、文法を覚えてください。見ればなんとなく分かります。
 構造体のメンバ変数やメンバ関数にアクセスする方法ですが、同じ構造体内からアクセスする方法と構造体外からアクセスする方法は異なります。サンプルソースでは構造体内のメンバ関数からアクセスする方法と、構造体外のmain関数からアクセスする方法2つを記述します。

構造体のメンバ関数を用いて、メンバ変数の値を表示する関数

#include<stdio.h>
struct SScore{		// struct Scoreの略
	int japanese;	// 日本語の点数
	int math;	// 数学の
	int english;	// 英語の
	void Draw();	// 関数のプロトタイプ宣言
};
int main (){
	SScore Score;	// 構造体定義名の前に「struct」がいらない
	Score.japanese = 50;	// 構造体の外からアクセスするにはドット演算子が必要
	Score.math = 70;
	Score.english = 40;
	Score.Draw();	// 構造体外から構造体のメンバを呼び出すにはドット演算子が必要
	return 0;
}
// 戻り値の型 構造体定義名 :: 関数名 (引数) のあと、関数の本体
void SScore::Draw(){
	printf("japaneseの点数は%d\n",japanese);	// 同じ構造体の中からは特別な記述なしでアクセスすることが出来る
	printf("mathの点数は	%d\n",math);
	printf("englishの点数は	%d\n",english);
}

構造体のメンバ関数を用いないで同じことをした場合

#include<stdio.h>
struct SScore{		// struct Scoreの略
	int japanese;	// 日本語の点数
	int math;	// 数学の
	int english;	// 英語の
};
int main (){
	SScore Score;	// 構造体定義名の前に「struct」がいらない

	Score.japanese = 50;	// 構造体の外からアクセスするにはドット演算子が必要
	Score.math = 70;
	Score.english = 40;

	printf("japaneseの点数は %d\n",Score.japanese);		// 構造体の外からアクセスするにはドット演算子が必要
	printf("mathの点数は	 %d\n",Score.math);
	printf("englishの点数は	 %d\n",Score.english);

	return 0;
}

 今回はメンバ関数を介してメンバ変数にアクセスする方法を紹介しましたが、構造体のメンバ関数内から同じ構造体のメンバ関数を呼び出すときもドット演算子は必要ないということを覚えておいてください。基盤のソースではそれを用いてます。構造体の定義はヘッダーファイルに、関数の定義はソースファイルに記述する形式をとっています。適当に照らし合わせてみてみてください。また、構造体自体はグローバルなものとして定義してあるので、全てのソースファイルから呼び出すことが可能です。詳しくは別の項で。