クラスの静的メンバ変数をデフォルト引数に設定してもオブジェクトの静的メンバ変数を初期化することはできません


つづき・・・




ソーラー「ところで


もう1度


クラスの静的メンバ変数宣言がもちいられたプログラムを実行してみましょう。


#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 件の未解決の外部参照


マックス「このプログラムのように


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


static int a;


を設定すると


ビルドエラーが表示されるか・・・


結局


Cube cube1;


により


生成される


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


cube1.aを初期化できないんじゃ


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


static int a;


を実行しても意味ないじゃんか」



マックス「オブジェクトcube1の静的メンバ変数


cube1.aを初期化・・・


初期化する方法か・・・


・・・・・・・・・・・・・


あっわかった!


クラス宣言内で


静的メンバ変数宣言


static int a;


を行っているが


そのとき


静的メンバ変数宣言,初期化


static int a=0;



同時に行ったらいいんじゃないか?」


ソーラー「ああ、いい


そのアイデア」


マックス「ふっ


そうか


そうだろう そうだろう


今度は


Cubeのクラス宣言内で


aの静的メンバ変数宣言,初期化


static int a=0;



おこなったプログラムを


実行してみるか


そうだな


試しに


Cubeのクラス宣言内で


aの静的メンバ変数宣言,初期化


static int a=0;


を設定し


main関数内で


オブジェクト宣言


Cube cube1;



実行してみるか😸」


#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 = 0;

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

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のコンストラクタが自動的に実行されています*/



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

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

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

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


return 0;

}


プログラムの実行結果


エラー (アクティブ) E1592 in-class initializer のあるメンバーは const である必要があります

エラー C2864 'Cube::a': in-class initializer を持つ静的 データ メンバー には、非揮発性 const integral 型が必要です


マックス「なんだ


このエラー文は・・・


Cubeのクラス宣言内で


static int a = 0;


を実行したために


このエラー文が表示されたのか・・・


static int a = 0;


と記述することができないとなると…


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


cube1.a


を初期化する方法をおもいつかないぞ」


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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