構造体の構造体宣言にメンバ変数として変数の他に構造体変数を加えてみます

てんC「さきほどはPlayerStatusDataの構造体宣言に


メンバ変数として


int型の変数

cleartimequest1

cleartimequest2

cleartimequest3

を加えました。


PlayerStatusDataの構造体宣言は


typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

}PlayerStatusData;

から


次のように変化したわけです。


typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}PlayerStatusData;


すこし表現が長くなりました。


そこで


3つの変数宣言

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;


以下のように構造体宣言Allcleartimequestをおこなうことにより

👇

typedef struct Allcleartimequest

{

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}Allcleartimequest;

👆

1つの


構造体変数宣言 Allcleartimequest Allcleartimequest1;


           👆

(Allcleartimequest1の構造体変数宣言、

この1文で

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;の代わりになります)


にまとめてみます。


そして


これら


Allcleartimequestの構造体宣言とAllcleartimequest1の構造体変数宣言を


さきほどのPlayerStatusDataの構造体宣言

👇

typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}PlayerStatusData;


に代入すると


typedef struct Allcleartimequest

{

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}Allcleartimequest;


typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

Allcleartimequest Allcleartimequest1;

}PlayerStatusData;


となります。


構造体宣言が2つになりました


構造体PlayerStatusDataの中の


構造体変数宣言Allcleartimequest Allcleartimequest1;


が機能するためには


構造体宣言Allcleartimequest

👇

typedef struct Allcleartimequest

{

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}Allcleartimequest;


の定義が


PlayerStatusDataの構造体宣言

👇

typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

Allcleartimequest Allcleartimequest1;

}PlayerStatusData;


の前に定義される必要があります。


つまり


構造体Allcleartimequest 


が定義されていないのに


構造体PlayerStatusDataに


構造体変数宣言Allcleartimequest Allcleartimequest1:


を加えても


機能しないということなのです



そのとき


構造体変数Allcleartimequest1を格納した


構造体 PlayerStatusDataをもちいて


typedef struct Allcleartimequest

{

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}Allcleartimequest;


typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

Allcleartimequest Allcleartimequest1;

}PlayerStatusData;

👆ですね


さきほどの


player1の

HP

MP

AP

TP

クエストクリア時間

cleartimequest1

cleartimequest2

cleartimequest3

データ

10

8

22

18

150

7800

123800


構造体変数宣言

PlayerStatusData player1StatusData;


を実行することにより


構造体PlayerStatusData型の構造体変数 player1StatusDataのメンバ変数に格納することができます。


このとき


構造体PlayerStatusData型の構造体変数 player1StatusDataのメンバ変数は


player1StatusData.HP

player1StatusData.MP

player1StatusData.AP

player1StatusData.TP

player1StatusData.Allcleartimequest1.cleartimequest1

player1StatusData.Allcleartimequest1.cleartimequest2

player1StatusData.Allcleartimequest1.cleartimequest3

となります」


ソーラー「メンバ変数が長くなっている!


player1StatusData.Allcleartimequest1.cleartimequest1

player1StatusData.Allcleartimequest1.cleartimequest2

player1StatusData.Allcleartimequest1.cleartimequest3


てんC「そして


player1StatusData.HP=10;

player1StatusData.MP=8;

player1StatusData.AP=22;

player1StatusData.TP=18;

player1StatusData.Allcleartimequest1.cleartimequest1=150;

player1StatusData.Allcleartimequest1.cleartimequest2=7800;

player1StatusData.Allcleartimequest1.cleartimequest3=123800;


のように

データを格納することができます。」


ソーラー「これは一体どういう仕組みなのかな?」


てんC「

構造体変数 player1StatusDataのメンバ変数は

player1StatusData.HP

player1StatusData.MP

player1StatusData.AP

player1StatusData.TP

player1StatusData.Allcleartimequest1.cleartimequest1

player1StatusData.Allcleartimequest1.cleartimequest2

player1StatusData.Allcleartimequest1.cleartimequest3

なっています。



つまり


構造体

typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}PlayerStatusData;



メンバ変数

cleartimequest1

cleartimequest2

cleartimequest3


にデータを格納する場合は


構造体変数宣言

PlayerStatusData player1StatusData;

を行い


player1StatusData.cleartimequest1 = 150;

player1StatusData.leartimequest2 = 7800;

player1StatusData.cleartimequest3 = 123800;


としました。


同様に


構造体

typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

Allcleartimequest Allcleartimequest1;

}PlayerStatusData;



メンバ変数

HP

MP;

AP

TP

Allcleartimequest1

にデータを格納する場合は


構造体変数宣言

PlayerStatusData player1StatusData;

を行い

構造体変数player1StatusDataのメンバ変数


player1StatusData.HP

player1StatusData.MP

player1StatusData.AP

player1StatusData.TP

player1StatusData.Allcleartimequest1


にデータを格納することになります。


このとき

player1の

HP

MP

AP

TP

クエストクリア時間

cleartimequest1

cleartimequest2

cleartimequest3

データ

10

8

22

18

150

7800

123800

構造体変数player1StatusDataのメンバ変数


player1StatusData.HP

player1StatusData.MP

player1StatusData.AP

player1StatusData.TP

player1StatusData.Allcleartimequest1

に格納していくことになります


player1StatusData.HP = 10;

player1StatusData.MP = 8;

player1StatusData.AP = 22;

player1StatusData.TP = 18;

までは今まで通りですね。


次に


クエストクリア時間

cleartimequest1  150

cleartimequest 7800

cleartimequest 123800



構造体変数player1StatusDataのメンバ変数である


player1StatusData.Allcleartimequest1のメンバ変数


player1StatusData.Allcleartimequest1.cleartimequest1

player1StatusData.Allcleartimequest1.cleartimequest2

player1StatusData.Allcleartimequest1.cleartimequest3


に格納していきます。


構造体変数player1StatusDataのメンバ変数である


player1StatusData.Allcleartimequest1に.を付けた


player1StatusData.Allcleartimequest1.cleartimequest1

player1StatusData.Allcleartimequest1.cleartimequest2

player1StatusData.Allcleartimequest1.cleartimequest3



構造体変数player1StatusDataのメンバ変数である


player1StatusData.Allcleartimequest1のメンバ変数


となります


そして


player1StatusData.Allcleartimequest1.cleartimequest1 = 150;

player1StatusData.Allcleartimequest1.cleartimequest2 = 7800;

player1StatusData.Allcleartimequest1.cleartimequest3 = 123800;


のようにデータを格納します。


このように


構造体変数player1StatusDataのメンバ変数である構造体変数player1StatusData.Allcleartimequest1を経由して



typedef struct Allcleartimequest

{

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}Allcleartimequest;


のメンバ変数

cleartimequest1

cleartimequest2

cleartimequest3


にデータを格納しているというわけです。




構造体変数Allcleartimequest1のメンバ変数は


Allcleartimequest1.cleartimequest1

Allcleartimequest1.cleartimequest2

Allcleartimequest1.cleartimequest3


となっており


さらに


構造体変数player1StatusDataのメンバ変数は


構造体変数player1StatusData.Allcleartimequest1となっているというわけです。


(ドット).演算子を用いて


player1StatusData.Allcleartimequest1.cleartimequest1

player1StatusData.Allcleartimequest1.cleartimequest2

player1StatusData.Allcleartimequest1.cleartimequest3 ;


と表記することにより

typedef struct Allcleartimequest

{

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}Allcleartimequest;


のメンバ変数


cleartimequest1

cleartimequest2

cleartimequest3


アクセスしてデータを代入しているというわけです。



それでは


先ほどの


プログラムをかきかえてみます。


元のプログラムは  

↓ ↓ ↓

#include <iostream>


using namespace std;

typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}PlayerStatusData;

/*ここの部分で

struct PlayerStatusDataの構造体宣言struct PlayerStatusDataを行うと同時に

構造体名を struct PlayerStatusDataからPlayerStatusDataに変更しました。

そして

クエスト終了時刻を格納するために

変数宣言

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

を追加しました。*/


int main(){


PlayerStatusData player1StatusData;

/* player1のステータスデータを管理するために

player1StatusDataの構造体変数宣言をおこないました。

*/


player1StatusData.HP=10;

player1StatusData.MP=8;

player1StatusData.AP=22;

player1StatusData.TP=18;

player1StatusData.cleartimequest1=150;

player1StatusData.cleartimequest2=7800;

player1StatusData.cleartimequest3=123800;

/* player1のステータスデータを

構造体変数 player1StatusDataのメンバ変数に代入しました。*/


cout << "player1" << "\n";

cout << player1StatusData.HP << "\n";

cout << player1StatusData.MP << "\n";

cout << player1StatusData.AP << "\n";

cout << player1StatusData.TP << "\n";

cout << player1StatusData.cleartimequest1 << "\n";

cout << player1StatusData.cleartimequest2 << "\n";

cout << player1StatusData.cleartimequest3 << "\n";


/* player1のステータスデータを表示しました。*/


return 0;

}


ビルド実行結果

player1

10

8

22

18

150

7800

123800


は書き換えられて



次のプログラムのように変化します。

👇  👇

#include <iostream>


using namespace std;

typedef struct Allcleartimequest

{

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;

}Allcleartimequest;


typedef struct PlayerStatusData

{

int HP;

int MP;

int AP;

int TP;

Allcleartimequest Allcleartimequest1;

}PlayerStatusData;


/*ここの部分で

struct PlayerStatusDataの構造体宣言struct PlayerStatusDataを行うと同時に

構造体名を struct PlayerStatusData からPlayerStatusDataに変更しました。

そして

int cleartimequest1;

int cleartimequest2;

int cleartimequest3;を


構造体変数宣言

Allcleartimequest Allcleartimequest1;

にかきかえました。

Allcleartimequestは構造体で

Allcleartimequest1は構造体変数です*/


int main() {


PlayerStatusData player1StatusData;

/* player1のステータスデータを管理するために

player1StatusDataの構造体変数宣言をおこないました。

*/


player1StatusData.HP = 10;

player1StatusData.MP = 8;

player1StatusData.AP = 22;

player1StatusData.TP = 18;

player1StatusData.Allcleartimequest1.cleartimequest1 = 150;

player1StatusData.Allcleartimequest1.cleartimequest2 = 7800;

player1StatusData.Allcleartimequest1.cleartimequest3 = 123800;

/*ここから大分長いコメント文になります

👇

player1のステータスデータを


構造体変数player1StatusDataのメンバ変数

player1StatusData.HP

player1StatusData.MP

player1StatusData.AP

player1StatusData.TP

player1StatusData. Allcleartimequest1.cleartimequest1

player1StatusData. Allcleartimequest1.cleartimequest2

player1StatusData. Allcleartimequest1.cleartimequest3

に代入し初期化しました。


構造体変数Allcleartimequest1を


構造体変数player1StatusDataのメンバ変数として


用いることにより


player1のクエストクリア時間の数値データを


player1StatusDataのメンバ変数である


player1StatusData.cleartimequest1

player1StatusData.cleartimequest2

player1StatusData.cleartimequest3に


player1StatusData.cleartimequest1=150;

player1StatusData.cleartimequest2=7800;

player1StatusData.cleartimequest3=123800;


と代入していた方法から


player1のクエストクリア時間の数値データを


構造体変数 player1StatusDataのメンバ変数である

構造体変数Allcleartimequest1のメンバ変数となった


Allcleartimequest1.cleartimequest1

Allcleartimequest1.cleartimequest2

Allcleartimequest1.cleartimequest3


に代入する方法である


player1StatusData.Allcleartimequest1.cleartimequest1=150; player1StatusData.Allcleartimequest1.cleartimequest2=7800; player1StatusData.Allcleartimequest1.cleartimequest3=123800;


に変化しています


このとき.(ドット演算子)が2回もちいられていますね


コメント文 終わり*/



cout << "player1" << "\n";

cout << player1StatusData.HP << "\n";

cout << player1StatusData.MP << "\n";

cout << player1StatusData.AP << "\n";

cout << player1StatusData.TP << "\n";

cout << player1StatusData.Allcleartimequest1.cleartimequest1 << "\n";

cout << player1StatusData.Allcleartimequest1.cleartimequest2 << "\n";

cout << player1StatusData.Allcleartimequest1.cleartimequest3 << "\n";


/* player1のステータスデータをcout出力表示しました。*/


return 0;

}

ビルド実行結果

player1

10

8

22

18

150

7800

123800



てんC「

以上で

Allcleartimequest1.cleartimequest1

Allcleartimequest1.cleartimequest2

Allcleartimequest1.cleartimequest3

をメンバ変数にもつ


構造体変数Allcleartimequest1を


構造体変数player1StatusDataのメンバ変数に加えた場合


構造体変数player1StatusDataのメンバ変数となった


構造体変数Allcleartimequest1に


数値データを格納するときの方法の説明について


終了します。」


ソーラー 「ありがとう~


player1StatusData.Allcleartimequest1.cleartimequest1


のように.(ドット演算子)が2つかわれるんだね。


ここは間違えやすかったんだ」


てんC「ソーラーさん、お役にたててよかったです。」 

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る