構造体について

struct.png

構造体とクラスの違い

class struct
デフォルトアクセス private public

どんな時に使う?

それがデータに過ぎず、データメンバにとって意味ある不変条件がないときに限り使え。

structに関数を書くのはいいこと??悪いこと??

コンストラクタは書いた方がよいそうだ。
イコールみたいな演算子も書いていいみたい。

注意

構造体は非公開ヘッダ定義する

性質

構造体の中に、自分と同じ型のポインタを含めることもできる

struct Link{
Link* previous;
Link* successor;
};

オブジェクトは含められない
struct No_good{
No_good member;//エラー:再帰的定義
};

注意

構造体の名前と構造体のメンバの名前がかぶっちゃだめ!
こうすると楽。

typdefして、struct修飾子をいらなくする。

typedef struct 構造体の名前{
int array[3][5];
int member;
}STRUCTNAME,*PSTRUCTNAME;

STRUCT struct;と宣言したとする

もっとシンプルな書き方

typedef struct{
int member;
}構造体の名前;

後で楽になる書き方

typedef struct _sZone{
    int zone;
    //コンストラクタ
    _sZone(){}
}Zone;

構造体の初期化

 ZeroMemory(&struct,sizeof(STRUCTNAME));

使うとき
PSTRUCTNAME mystruct;

こっちだと、こうしなきゃならなくて面倒。
STRUCTNAME mystruct={0,0};

デフォルトコンストラクタを書いておけば、↑のような面倒なことをしなくてもいい。

構造体の継承は可能か?

できない。

テンプレートな構造体

template<typename T>
struct MIFFYSTRUCT{};

この場合はtypedef structしなくてもいいみたい。

構造体メンバのアライメント

#pragma pack(2)//2byte境界にする

構造体のメンバをどんな区切りで読むのか?
もし、この区切りよりも小さいサイズのメンバがいたら、足りないバイト数のところは0で埋められて変なことになる。
設定する場所は
構成プロパティ->C/C++->コード生成->構造体メンバのアライメント
である。
デフォルトでは8バイト区切りになっている。
これをちゃんとすれば、構造体を配列のように扱って、ポインタを渡す、なんてことができる。
あるいはコードにかく

構造体にファイルを読む

ifs.read(reinterpret_cast<char *>(&構造体変数名),sizeof(構造体));

サポートサイト Wikidot.com