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

オブジェクト宣言により生成されるオブジェクトの静的メンバ変数aを初期化するにはmain関数の前で、再びaのクラスのメンバ変数宣言を実行する必要があります

🌞  🌞  🌞  🌞  🌞  🌞  🌞  🌞  🌞  🌞

ここで再度


注意事項のお知らせです。


本書では理解を促すために


🌞や💖などの絵文字(ユニコード)を/*コメント*/内で使用しているため


本書のプログラムを


そのままコピペして実行すると


以下のような

👇

______________________

Microsoft visual studio


!Source.cpp


このファイルのUnicode文字の一部は現在のコードページでは保存できません。

データを保持するためUnicodeで保存し直しますか?


はい

いいえ

その他のエンコードで保存

キャンセル

______________________

👆

メニューが表示されることがあります。


この場合


いいえ


を選択してください


はい


を選択すると


それ以降


そのファイルではプログラムをうまく実行することができなくなります


いいえを

を選択すれば

普通通りにプログラムを実行することができます。



もしくは


本書のプログラムを


そのままコピペして実行せず


コメント内の絵文字を削除してプログラムを実行してください


🌞  🌞  🌞  🌞  🌞  🌞  🌞  🌞  🌞  🌞



お話は


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


int Cube::a;



設定する前に戻って・・・・・




マックス「ふ~ん


Cubeのクラス宣言内で


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


static int a;


を記述することにより


設定される


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


cube1のクラスCube型のオブジェクト宣言を実行すると


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


cube1.a


が作製される・・・・


しかし


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


cube1.a



cube1.a=0;


のように


数値データを代入、初期化することはできなかった。


今の時点では


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


cube1.a



初期化する方法がわからないというわけだ。


もう


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


static int a;


がなんのためにあるのか


わからにゃ~~~い


このプログラムなんだよなあ

👇

なんとか


クラスCube型のcube1のオブジェクト宣言により生成される


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

cube1.a

を初期化できたらいいんだがな。


👇」



#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() {


no = 0;

tate = 0;

yoko = 0;

takasa = 0;


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


}

/*👆🌞

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

🌞*/



void Cube::display() {


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

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

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

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


}


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



int main() {


Cube cube1;

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

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

cube1.a = 0;


cout << "cube1.aは" <<cube1.a<< "に初期化されました" << "\n";

return 0;

}


プログラムの実行結果


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

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


マックス「static int a;か・・・


う~~むぅ


あ、もうこれはないな。


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


cube1.aを初期化する方法はなし


以上だ。」


ソーラー「ところが


この


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


cube1.a



初期化する方法があるんだな


これが😊」



てんC「そうなんです。マックスさん」



マックス「え~~ そ~なのか


あらかた


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


cube1.a


を初期化する方法は試したからなあ。


いやあ  さすがに


これはわからないな」


ソーラー「ふふ


そうですか


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


cube1.aを初期化できるようになるためには




🌳Cubeのクラス宣言の後🌳


🌳 main関数の前 🌳




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


int Cube::a;



実行します。」


マックス「????????????」


ソーラー「


そのプログラムはこちらとなります」

👇


#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の静的メンバ変数宣言はここですよ~ん🌞🌞🌞

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


};


Cube::Cube() {


no = 0;

tate = 0;

yoko = 0;

takasa = 0;


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


}

/*👆🌞

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

🌞*/



void Cube::display() {


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

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

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

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


}


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


int Cube::a ;



//👆🌞🌞🌞ここです🌞🌞🌞aのクラスCubeのメンバ変数宣言を行っています


int main() {


Cube cube1;


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

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


cube1.a=0;


cout << "オブジェクトcube1の静的メンバ変数cube1.aは" <<cube1.a<< "に初期化されました" << "\n";

return 0;

}


プログラムの実行結果


生成されたオブジェクトのメンバ変数を初期化しました

オブジェクトcube1の静的メンバ変数cube1.aは0に初期化されました


マックス「なにぃ これは・・・


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


cube1.a


が初期化できている!Σ(・ω・ノ)ノ!


Cubeのクラス宣言の後


main関数の前



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


🌞int Cube::a;🌞


を記述することで


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


                cube1.a



           初期化できるようになるのか


なんだ??


ど~いう仕組みなんだ


だいたい


       Cubeのクラス宣言内で


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


static int a;

          


実行しているのに


生成されるオブジェクトcube1の静的メンバ変数


cube1,a


に数値を代入できるようにするために


再び

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


int Cube::a;



実行するのか」


ソーラー「そうなんです。


そして


Cubeのクラス宣言の後


main関数の前



int Cube::a;


を記述することがポイントなんです。


試しに


main関数内で


int Cube::a;


を実行すると


ビルドエラーが表示されます。」

👇

#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() {


no = 0;

tate = 0;

yoko = 0;

takasa = 0;


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


}

/*👆🌞

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

🌞*/



void Cube::display() {


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

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

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

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


}


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



int main() {

int Cube::a;


//👆🌞🌞🌞ここでaのクラス Cubeのメンバ変数宣言を行っています


Cube cube1;


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

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



cube1.a = 0;


cout << "cube1.aは" << cube1.a << "に初期化されました" << "\n";


return 0;

}


プログラムの実行結果



エラー (アクティブ) E0551 メンバー "Cube::a" は現在のスコープでは定義できません

エラー C2086 'int Cube::a': 再定義されました。

エラー C2655 'Cube::a': 現在のスコープ内で識別子が再宣言あるいは再定義されています。


ソーラー「int Cube::a ;



重要な働きをしているんだね。」






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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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