import std.stdio;
// 「人」型を class で定義
class Parson
{
// メンバ変数の定義
// 名前
char[] name;
// 場所
char[] location;
// メンバ関数の定義
// メンバ変数の定義は普通の関数の定義を構造体などの中に記述することで行われます。
// メンバ関数の中では、同じクラス内のメンバの変数や関数がスコープに含まれるので、
// name や location 、 WakeUp などにアクセスすることができます。
// 起床
void WakeUp()
{
writefln( "%sは現在%sにいます。", name, location );
writefln( "%sは%sで目を覚ました。\n", name, location );
}
// 食事
void Eat(char[] foodName)
{
writefln( "%sは現在%sにいます。", name, location );
writefln( "%sは%sを食べた。少し元気になった。\n", name, foodName );
}
// 移動
void Move(char[] locationName)
{
writefln( "%sは現在%sにいます。", name, location );
writefln( "%sは%sから%sへ移動した。\n", name, location, locationName );
location = locationName;
}
// 勉強
void Study()
{
writefln( "%sは現在%sにいます。", name, location );
writefln( "%sは勉強した。少し賢くなった。\n", name );
}
// 就寝
void Sleep()
{
writefln( "%sは現在%sにいます。", name, location );
writefln( "%sは%sで眠りに就いた。\n", name, location );
}
}
// メインの流れ
int main(char[][] args)
{
// new Parson でParsonクラスのインスタンスを作ることができる。
// keiichi は ポインタ型の変数のようなものとなり、 new Parson を代入することで
// 初めて使用することができる。
Parson keiichi = new Parson;
with (keiichi)
{
name = "前原圭一".dup;
location = "自室".dup;
}
// メンバ関数の使い方。
// 変数と同じように"."(ピリオド)でアクセスすることで使用することができます。
keiichi.WakeUp();
keiichi.Move( "食卓".dup );
keiichi.Eat( "朝食".dup );
keiichi.Move( "学校".dup );
// メンバ関数にもwith文でアクセスすることができます。
with (keiichi)
{
Study();
Eat( "お昼の弁当".dup );
Study();
Move( "家".dup );
Move( "食卓".dup );
Eat( "夕食".dup );
Move( "自室".dup );
Study();
Sleep();
}
return 0;
}
前原圭一は現在自室にいます。
前原圭一は自室で目を覚ました。
前原圭一は現在自室にいます。
前原圭一は自室から食卓へ移動した。
前原圭一は現在食卓にいます。
前原圭一は朝食を食べた。少し元気になった。
前原圭一は現在食卓にいます。
前原圭一は食卓から学校へ移動した。
前原圭一は現在学校にいます。
前原圭一は勉強した。少し賢くなった。
前原圭一は現在学校にいます。
前原圭一はお昼の弁当を食べた。少し元気になった。
前原圭一は現在学校にいます。
前原圭一は勉強した。少し賢くなった。
前原圭一は現在学校にいます。
前原圭一は学校から家へ移動した。
前原圭一は現在家にいます。
前原圭一は家から食卓へ移動した。
前原圭一は現在食卓にいます。
前原圭一は夕食を食べた。少し元気になった。
前原圭一は現在食卓にいます。
前原圭一は食卓から自室へ移動した。
前原圭一は現在自室にいます。
前原圭一は勉強した。少し賢くなった。
前原圭一は現在自室にいます。
前原圭一は自室で眠りに就いた。
import std.stdio;
// クラス Hoge を定義
class Hoge
{
// プライベート変数 cnt
private int cnt;
// プライベート変数 name
private char[] name;
// パブリック関数 void setName(char[] str)
public void setName(char[] str)
{
// private 変数はクラス内からは参照が可能
cnt = str.length;
name = str;
}
// パブリック関数 int count()
// デフォルトは パブリックなのです。
int count()
{
return cnt;
}
// 以降全てパブリックしたい場合には public: とするといいです。
// 同様に、残りはすべてプライベートとして宣言したいならば private: でもOKです。
public:
// パブリック関数 char[] getName()
char[] getName()
{
return name;
}
}
int main(char[][] args)
{
// Hoge のインスタンス hoge
Hoge hoge = new Hoge;
// hoge に名前 "aaaaa" を設定
hoge.setName("aaaaa".dup);
writefln(hoge.getName(), " : ", hoge.count());
// hoge に名前 "bb" を設定
hoge.setName("bb".dup);
writefln(hoge.getName(), " : ", hoge.count());
// private 変数は外部からアクセス不可能
// ただし、同じファイル内の場合のみこの制限は無効になります。
// なので、この場合は以下のコードもコンパイル可能です
// しかしながら、クラスHogeが別のファイルで定義されていた場合はコンパイルエラーが生じます。
/+
hoge.name = "ccc".dup;
writefln(hoge.name, " : ", hoge.cnt);
+/
return 0;
}
aaaaa : 5
bb : 2
import std.stdio;
// クラス Hoge の定義
class Hoge
{
int cnt;
// コンストラクタの定義
this()
{
// コンストラクタが呼び出されました
writefln("constructor called!");
// 期化されていなければならないメンバ変数 cnt の初期化を
// インスタンス生成時に行う
cnt = 0;
}
// メンバ関数 void func() の定義
void func()
{
// 初期化されていなければならないメンバ変数 cnt の使用
cnt++;
// 関数が実行されたことを通知。
// 呼び出された回数を表示する。
writefln("function called! count : ", cnt);
}
}
// メイン関数
int main(char[][] args)
{
// インスタンスの作成(コンストラクタの呼び出し)
Hoge hoge = new Hoge;
// 1回目
hoge.func();
// 2回目
hoge.func();
// 3回目
hoge.func();
// 4回目
hoge.func();
// 5回目
hoge.func();
return 0;
}
constructor called!
function called! count : 1
function called! count : 2
function called! count : 3
function called! count : 4
function called! count : 5
import std.stdio;
// クラス Hoge の定義
class Hoge
{
int cnt;
// コンストラクタの定義
this(int c)
{
// コンストラクタが呼び出されました。
// 初期値を表示します
writefln("constructor called! count default value : ", c);
// 期化されていなければならないメンバ変数 cnt の初期化を
// インスタンス生成時に行う
cnt = c;
}
// メンバ関数 void func() の定義
void func()
{
// 初期化されていなければならないメンバ変数 cnt の使用
cnt++;
// 関数が実行されたことを通知。
// 呼び出された回数を表示する。
writefln("function called! count : ", cnt);
}
}
// メイン関数
int main(char[][] args)
{
// インスタンスの作成(コンストラクタの呼び出し)
// 初期値を 5 として指定する。
// このように
// new ClassName(value)
// として引数付きコンストラクタを利用する
Hoge hoge = new Hoge(5);
// 1回目
hoge.func();
// 2回目
hoge.func();
// 3回目
hoge.func();
// 4回目
hoge.func();
// 5回目
hoge.func();
return 0;
}
constructor called! count default value : 5
function called! count : 6
function called! count : 7
function called! count : 8
function called! count : 9
function called! count : 10
int main(char[][] args)
{
// Hogeのインスタンスを 10 で初期化
writefln("コンストラクタを呼び出します。");
Hoge hoge = new Hoge(10);
writefln("表示します");
hoge.disp();
writefln("カウントアップします");
hoge.countUp();
writefln("表示します");
hoge.disp();
writefln("カウントダウンします");
hoge.countDown();
writefln("表示します");
hoge.disp();
return 0;
}
コンストラクタを呼び出します。
コンストラクタを呼び出しました。値 : 10
表示します
値は 10 です
カウントアップします
表示します
値は 11 です
カウントダウンします
表示します
値は 10 です