オブジェクトの静的メンバ変数を初期化することはできませんシリーズ

クラスCubeの静的メンバ変数宣言static int a;をCubeのクラス宣言内に設定するならmain関数の前でaのクラスCubeのメンバ変数宣言int Cube::a;を実行する必要があります



マックス「そうだ


cube1のクラスCube型のオブジェクト宣言


Cube cube1;


を実行して


クラスCube型のオブジェクトcube1を作製して


クラスCube型のオブジェクトcube1の静的メンバ変数


cube1.aを生成しても


cube1.a=0;


のように


直接


数値を代入することはできないなら


クラスCubeのコンストラクタCube()


の定義内で


Cube::Cube() {

 

 a=0;

no = 0;

tate = 0;

yoko = 0;

takasa = 0;


cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";


}


のように


クラスの静的メンバ変数を初期化する


a=0;



実行すれば


もしかしたら


クラスCube型のオブジェクト宣言


Cube cube1;


を実行したとき



クラスCubeのコンストラクタCube()


の定義内

👇


Cube::Cube() {

 

 a=0;

no = 0;

tate = 0;

yoko = 0;

takasa = 0;


cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";


}



a

no

tate

yoko

takasa

オブジェクトcube1のメンバ変数

cube1.a

cube1.no

cube1.tate

cube1.yoko

cube1.takasa

が代入されたものが

実行されるはずだろ


そのとき

a

cube1.a


を表すことになるので


a=0;



cube1.a=0;


となり


間接的に


オブジェクトcube1の静的メンバ変数


cube1.a



cube1.a=0;



初期化することができるんじゃないか?


そのプログラムを実行でぇい


そのプログラムは以下のようになります

👇

#include <iostream>


using namespace std;


class Cube{


public:

int no; //変数noはクラスCubeのメンバ変数とよばれます

public:

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

public:

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

public:

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます


public:

Cube();


/*🌞🌞🌞クラスCubeのコンストラクタCube() のメンバ関数宣言を行っています*/


public:

void display(); //自作関数display()のクラスCubeのメンバ関数宣言を行っています


public:

static int a;

/*🌞🌞🌞ここですよ~ん🌞🌞🌞

静的メンバ変数aのCubeのメンバ変数宣言を行っています*/


};


Cube::Cube() {

 

 a=0;

no = 0;

tate = 0;

yoko = 0;

takasa = 0;


cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";


}

/*👆🌞

クラスCubeのコンストラクタCube()の定義を行っています

🌞👆この定義内でクラスの静的メンバ変数aを初期化するa=0;を配置しました🌞*/



void Cube::display() {


cout << "立方体につけられたナンバーは" << no << "です" << "\n";

cout << "立方体の縦の長さは" << tate << "です" << "\n";

cout << "立方体の横の長さは" << yoko << "です" << "\n";

cout << "立方体の高さの長さは" << takasa << "です" << "\n";


}


//👆クラスCubeのメンバ関数となっている自作関数display()の定義をおこなっています



int main() {


Cube cube1;


//👆cube1のクラスCube型のオブジェクト宣言をおこなっています

/*🌞このとき オブジェクトcube1のコンストラクタが自動的に実行されています*/


return 0;

}


プログラムの実行結果



エラー LNK2001 外部シンボル ""public: static int Cube::a" (?a@Cube@@2HA)" は未解決です。

エラー LNK1120 1 件の未解決の外部参照



マックス「なんだ・・・


 ビルド実行できてない・・・


この方法でも


クラスCube型のオブジェクトcube1の静的メンバ変数


cube1.a



初期化できないのか・・・」


👇



                  つづく・・・


👇




てんC「マックスさん


実は


クラスCubeの静的メンバ変数宣言


static int a;



Cubeのクラス宣言内に設定するなら


Cubeのクラス宣言の後ろ


main関数の前で


aのクラスCubeのメンバ変数宣言


int Cube::a;



実行しておく必要があります」


以下の位置で

👇


aのクラスCubeのメンバ変数宣言


int Cube::a;



設定する必要があります


👇


class Cube{


public:

int no; //変数noはクラスCubeのメンバ変数とよばれます

public:

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

public:

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

public:

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます


public:

Cube();


/*🌞🌞🌞クラスのコンストラクタCube::Cube() のメンバ関数宣言を行っています*/


public:

void display(); //自作関数display()のクラスCubeのメンバ関数宣言を行っています


public:

static int a;

/*🌞🌞🌞ここですよ~ん🌞🌞🌞

静的メンバ変数aのCubeのメンバ変数宣言を行っています*/


};


Cube::Cube() {

 

 a=0;

no = 0;

tate = 0;

yoko = 0;

takasa = 0;


cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";


}

/*👆🌞

クラスCubeのコンストラクタCube()の定義を行っています

🌞👆この定義内でクラスCube型のオブジェクトの静的メンバ変数aを初期化することになるa=0;を配置しました🌞*/



void Cube::display() {


cout << "立方体につけられたナンバーは" << no << "です" << "\n";

cout << "立方体の縦の長さは" << tate << "です" << "\n";

cout << "立方体の横の長さは" << yoko << "です" << "\n";

cout << "立方体の高さの長さは" << takasa << "です" << "\n";


}



int Cube::a;//👈👈👈🌞🌞🌞ここです わかったかな?🌞🌞🌞



int main() {


Cube cube1;


//👆cube1のクラスCube型のオブジェクト宣言をおこなっています

/*🌞このとき オブジェクトcube1のコンストラクタが自動的に実行されています*/


return 0;

}


マックス「??なにい



クラスCubeの静的メンバ変数宣言


static int a;



Cubeのクラス宣言内に設定するなら


Cubeのクラス宣言の後ろ


main関数の前で


aのクラスCubeのメンバ変数宣言???


int Cube::a;



実行しておく必要があるのか???


aのクラスCubeのメンバ変数宣言???


int Cube::a;


なんじゃあ そりゃあ


そんなに


aのクラスCubeのメンバ変数宣言


int Cube::a;


は重要なのか


だいたい


Cubeのクラス宣言


class Cube {


public:

int no; //変数noはクラスCubeのメンバ変数とよばれます

public:

float tate; //変数tateはクラスCubeのメンバ変数とよばれます

public:

float yoko; //変数yokoはクラスCubeのメンバ変数とよばれます

public:

float takasa; //変数takasaはクラスCubeのメンバ変数とよばれます


public:

Cube();


/*🌞🌞🌞クラスCubeのコンストラクタCube() のメンバ関数宣言を行っています*/


public:

void display(); //自作関数display()のクラスCubeのメンバ関数宣言を行っています


public:

static int a;

/*🌞🌞🌞ここですよ~ん🌞🌞🌞

aのクラスCubeの静的メンバ変数宣言を行っています*/


};


内で


静的メンバ変数aのクラスCubeのメンバ変数宣言


static int a;

が実行されているのに


aのクラスCubeの静的メンバ変数宣言


int Cube::a;


を実行する必要があるんかい」


てんC「


int Cube::a;



aがクラスCubeの中で用いられている変数であることを示すために


記述する必要があります



なぜ、そうなるかはこれからのエピソードで考察してみましょう」



マックス「ぜんぜんわからんが


もしかしたら


aがクラスCubeの中で用いられている変数であることがわからなくなる


場合がでてくるから


int Cube::a;


を実行する必要があったりして・・・・な(*´▽`*)」



てんC「マックスさん


するどい・・・


というわけで


クラスの静的メンバ変数aをもちいるには


あらかじめ


Cubeのクラス宣言の後ろ


main関数の前で


aのクラスCubeのメンバ変数宣言


int Cube::a;



実行しておく必要があります


そうしなければ


クラスCube型のオブジェクト宣言


Cube cube1;


を実行して


cube1.a


を使用することはできません


そして



クラスのコンストラクタの定義内で


a


クラスのコンストラクタの定義内で


クラスの静的メンバ変数aをもちいることができるようにするためには


やはり


あらかじめ


Cubeのクラス宣言の後ろ


main関数の前で


aのクラスCubeのメンバ変数宣言


int Cube::a;



実行しておく必要があります」


マックス「ふ~むぅ


Cubeのクラス宣言の後ろ


main関数の前で


aのクラスのメンバ変数宣言


        int Cube::a;


か・・・


なぜ必要のか・・・???


でも なんとなく


必要な感じがするな・・・」


てんC「そうなんです


int Cube::a;


のように


あらかじめ


aのクラスCubeのメンバ変数宣言を


実行しておく必要があります。


今のプログラムのように


Cubeのクラス宣言の後ろ


main関数の前で


aのクラスCubeのメンバ変数宣言


int Cube::a;


を実行しないのであれば


クラスCubeのコンストラクタ


Cube()


の定義


Cube::Cube() {

 

 a=0;

no = 0;

tate = 0;

yoko = 0;

takasa = 0;


cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";


}


内で


クラスの静的メンバ変数a


をもちいることはできません。


クラスCubeのコンストラクタ


Cube()


の定義内で


aが使用されていると


ビルドエラーが表示されることになります。」


マックス「


Cubeのクラス宣言の後ろ


main関数の前で


aのクラスのメンバ変数宣言


        int Cube::a;


が必要か・・・」



















































































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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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