クラスの静的メンバ関数の定義に クラスのメンバ変数を用いることはできません
ソーラー「以下のプログラムをみていただければお分かりになられますように
Cubeのクラス宣言内で
static void show();
のように
静的メンバ関数宣言された
クラスCubeの静的メンバ関数show()を実行するのに
main関数内で
クラスCube型のオブジェクト宣言を行い
クラスCube型のオブジェクトを作製しなくても
Cube::show;
と記述することで実行できました」
#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のメンバ変数宣言を行っています*/
public:
static void show();
/*🌞🌞🌞
静的メンバ関数show()のCubeのメンバ関数宣言を行っています*/
};
Cube::Cube() {
no = 0;
tate = 0.0;
yoko = 0.0;
takasa = 0.0;
cout << "生成されたクラスCube型のオブジェクトのメンバ変数を初期化しました" << "\n";
}
/*👆🌞
クラスCubeのコンストラクタCube()の定義を行っています
🌞*/
void Cube::display() {
cout << a << "回目のオブジェクトcube1のメンバ関数display()を実行しました" << "\n";
a++;
cout << "cube1.aの値は" << a << "になりました" << "\n";
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
}
//👆クラスCubeのメンバ関数となっている自作関数display()の定義をおこなっています
int Cube::a = 1;
//👆静的メンバ変数aの初期化を行っています
void Cube::show() {
cout << "クラスたのしい~~~" << "\n";
}
//🌞ここでクラスCubeの静的メンバ関数show()を実行しています🌞
int main() {
Cube::show();
//👆クラスCube型のメンバ関数を実行しています
/*🌞このとき オブジェクトcube1のオブジェクト宣言を実行していません*/
return 0;
}
ビルド実行結果
クラスたのしい~~~
今度は
クラスCubeの静的メンバ関数の定義を
void Cube::show() {
cout << "クラスたのしい~~~" << "\n";
}
から
void Cube::show() {
cout << "クラスたのしい~~~" << "\n";
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
}
に変更し
main関数内で
クラスCubeの静的メンバ関数
Cube::show();
を実行する前に
cube1のクラスCube型のオブジェクト宣言
Cube cube1;
を
実行するプログラムを実行してみたいと思います。
cube1のクラスCube型のオブジェクト宣言
Cube cube1;
が実行されると同時に
クラスCubeのコンストラクタの定義
Cube::Cube() {
no = 0;
tate = 0.0;
yoko = 0.0;
takasa = 0.0;
cout << "生成されたクラスCube型のオブジェクトのメンバ変数を初期化しました" << "\n";
}
の
no
tate
yoko
takasa
に
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
が代入された
cube1.no = 0;
cube1.tate = 0.0;
cube1.yoko = 0.0;
cube1.takasa = 0.0;
cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";
が実行されるので
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
は
0
0.0
0.0
0.0
の値を持つことになるはずです。
(・・・はず? solarplexuss )
そして
プログラムの実行結果に
生成されたオブジェクトのメンバ変数を初期化しました
が表示されるはずです。
次に
クラスCubeの静的メンバ関数
Cube::show();
を実行すると
クラスCubeの静的メンバ関数show()の定義
void Cube::show() {
cout << "クラスたのしい~~~" << "\n";
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
}
内の
no
tate
yoko
takasa
に
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
が代入された
cout << "クラスたのしい~~~" << "\n";
cout << "立方体につけられたナンバーは" << cube1.no << "です" << "\n";
cout << "立方体の縦の長さは" << cube1.tate << "です" << "\n";
cout << "立方体の横の長さは" << cube1.yoko << "です" << "\n";
cout << "立方体の高さの長さは" << cube1.takasa << "です" << "\n";
が実行されることになるはずです。
((#^.^#)嘘です)
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
は
0
0.0
0.0
0.0
の値を持つので
Cube::show();
が実行されると
クラスたのしい~~~
立方体につけられたナンバーは0です
立方体の縦の長さは0です
立方体の横の長さは0です
立方体の高さの長さは0です
がビルド実行結果に
表示されるはず?だよね(*´▽`*)/」
マックス「まあ、そうだろうな
なんだもう 簡単じゃな~い
ソーラーったら💖」
ソーラー「あは(*^^*)
それでは先ほどのプログラムの
クラスCubeの静的メンバ関数の定義を
void Cube::show() {
cout << "クラスたのしい~~~" << "\n";
}
から
void Cube::show() {
cout << "クラスたのしい~~~" << "\n";
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
}
に変更し
main関数内で
クラスCubeの静的メンバ関数
Cube::show();
を実行する前に
cube1のクラスCube型のオブジェクト宣言
Cube cube1;
を
実行して
クラスCube型のオブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
に数値データ
0
0.0
0.0
0.0
を代入しておいてから
クラスCubeの静的メンバ関数
Cube::show();
が実行されるよう
元のプログラムを変形したプログラムを実行してみます😊」
#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のメンバ変数宣言を行っています*/
public:
static void show();
/*🌞🌞🌞
静的メンバ関数show()のCubeのメンバ関数宣言を行っています*/
};
Cube::Cube() {
no = 0;
tate = 0.0;
yoko = 0.0;
takasa = 0.0;
cout << "生成されたクラスCube型のオブジェクトのメンバ変数を初期化しました" << "\n";
}
/*👆🌞
クラスCubeのコンストラクタCube::Cube()の定義を行っています
🌞*/
void Cube::display() {
cout << a << "回目のオブジェクトcube1のメンバ関数display()を実行しました" << "\n";
a++;
cout << "cube1.aの値は" << a << "になりました" << "\n";
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
}
//👆クラスCubeのメンバ関数となっている自作関数 displayの定義をおこなっています
int Cube::a = 1;
//👆静的メンバ変数aの初期化を行っています
void Cube::show() {
cout << "クラスたのしい~~~" << "\n";
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
}
//😊😊😊静的メンバ関数show()の定義を変更しました(ここがポイントとなる点です)
int main() {
Cube cube1;
Cube::show();
//👆クラスCubeの静的メンバ関数show()を実行しています
return 0;
}
ビルド実行結果
エラー (アクティブ) E0245 静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります
エラー (アクティブ) E0245 静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります
エラー (アクティブ) E0245 静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります
エラー (アクティブ) E0245 静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります
エラー C2597 静的でないメンバー 'Cube::yoko' への参照が正しくありません。
エラー C2597 静的でないメンバー 'Cube::tate' への参照が正しくありません。
エラー C2597 静的でないメンバー 'Cube::takasa' への参照が正しくありません。
エラー C2597 静的でないメンバー 'Cube::no' への参照が正しくありません。
ソーラー「クラスCubeの静的メンバ関数の定義に
クラスCubeのメンバ変数を用いた
クラスCubeの静的メンバ関数の実行が出来てない??」
てんC「ソーラーさん
エラー (アクティブ) E0245 静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります
と
ビルド実行結果に表示されているように
cube1のクラスCube型のオブジェクト宣言
Cube cube1;
の実行の後
クラスCubeのメンバ関数
Cube::show();
が実行されるとき
クラスCubeの静的メンバ関数show()の定義
void Cube::show() {
cout << "クラスたのしい~~~" << "\n";
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
}
内の
no
tate
yoko
takasa
に
オブジェクトcube1のメンバ変数
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
が代入された
cout << "クラスたのしい~~~" << "\n";
cout << "立方体につけられたナンバーは" << cube1.no << "です" << "\n";
cout << "立方体の縦の長さは" << cube1.tate << "です" << "\n";
cout << "立方体の横の長さは" << cube1.yoko << "です" << "\n";
cout << "立方体の高さの長さは" << cube1.takasa << "です" << "\n";
が実行されることはないのですね。
つまり
クラスCubeの静的メンバ関数
Cube::show();
の実行において
no
tate
yoko
takasa
は
cube1.no
cube1.tate
cube1.yoko
cube1.takasa
をあらわさない設定になっているのですね。
そもそも
ふつうのクラスCubeのメンバ変数
no
tate
yoko
takasa
を
クラスCubeの静的メンバ関数の定義内で
void Cube::show() {
cout << "クラスたのしい~~~" << "\n";
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
}
のように用いてはいけません
今のプログラムで
たとえ
クラスCubeのメンバ関数
Cube::show();
を実行する代わりに
クラスCube型のオブジェクトcube1のメンバ関数
cube1.show();
を実行したとしても
クラスCubeの静的メンバ関数の定義
void Cube::show() {
cout << "クラスたのしい~~~" << "\n";
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
}
内で
no
tate
yoko
takasa
が用いられているため
うまくプログラムをビルド実行することはできません。
そのプログラムはこちらになります。
👇
#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のメンバ変数宣言を行っています*/
public:
static void show();
/*🌞🌞🌞
静的メンバ関数show()のCubeのメンバ関数宣言を行っています*/
};
Cube::Cube() {
no = 0;
tate = 0.0;
yoko = 0.0;
takasa = 0.0;
cout << "生成されたオブジェクトのメンバ変数を初期化しました" << "\n";
}
/*👆🌞
クラスCubeのコンストラクタCube()の定義を行っています
🌞*/
void Cube::display() {
cout << a << "回目のオブジェクトcube1のメンバ関数display()を実行しました" << "\n";
a++;
cout << "cube1.aの値は" << a << "になりました" << "\n";
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
}
//👆クラスCubeのメンバ関数となっている自作関数 displayの定義をおこなっています
int Cube::a = 1;
//👆静的メンバ変数aの初期化を行っています
void Cube::show() {
cout << "クラスたのしい~~~" << "\n";
cout << "立方体につけられたナンバーは" << no << "です" << "\n";
cout << "立方体の縦の長さは" << tate << "です" << "\n";
cout << "立方体の横の長さは" << yoko << "です" << "\n";
cout << "立方体の高さの長さは" << takasa << "です" << "\n";
}
//😊😊😊静的メンバ関数show()の定義を変更しました
int main() {
Cube cube1;
cube1.show();
//👆🌞ここです!クラスCube型のオブジェクトcube1の静的メンバ関数show()を実行しています
return 0;
}
ビルド実行結果
エラー (アクティブ) E0245 静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります
エラー (アクティブ) E0245 静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります
エラー (アクティブ) E0245 静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります
エラー (アクティブ) E0245 静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります
エラー C2597 静的でないメンバー 'Cube::yoko' への参照が正しくありません。
エラー C2597 静的でないメンバー 'Cube::tate' への参照が正しくありません。
エラー C2597 静的でないメンバー 'Cube::takasa' への参照が正しくありません。
エラー C2597 静的でないメンバー 'Cube::no' への参照が正しくありません。
ソーラー「ほんとだね。
クラスCubeの静的メンバ関数の定義に
クラスCubeのメンバ変数を用いることができないんだね。
じゃあ
どうやったら
クラスCubeの静的メンバ関数の定義に
クラスCubeのメンバ変数を用いることができるのかな?
クラスCubeのメンバ変数をもちいることができないと
クラスCubeの静的メンバ関数を用いて
クラスCubeのメンバ変数に
数値データを代入するような命令文は実行できないことになるよね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます