🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
クラスCubeの静的メンバ変数宣言static int a;をCubeのクラス宣言内に設定するならmain関数の前でaのクラスCubeのメンバ変数宣言int Cube::a;を実行する必要があります
オブジェクトの静的メンバ変数を初期化することはできませんシリーズ
クラス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;
が必要か・・・」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます