クラスの静的メンバ関数の定義に クラスのメンバ変数を用いることはできません

ソーラー「以下のプログラムをみていただければお分かりになられますように


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のメンバ変数に


数値データを代入するような命令文は実行できないことになるよね」










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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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