🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
ポリモーフィズムを用いると他の命令文の影響を受けることなく指定した関数を別の関数に置き換えることができます そこが非常に優れている点です
ポリモーフィズムを用いると他の命令文の影響を受けることなく指定した関数を別の関数に置き換えることができます そこが非常に優れている点です
ポリモーフィズムを用いると他の命令文の影響を受けることなく指定した関数を別の関数に置き換えることができます そこが非常に優れている点です
ソーラー「それでは
純粋仮想関数
が用いられた
プログラムを実行していきたいと思います。」
ソーラー「まず一つの親クラスと
その親クラスのメンバ変数宣言、メンバ関数宣言を
継承した
子クラスを
3つ用意します
まずは
親クラスCharacterのクラス宣言と
親クラスCharacterのメンバ関数characterdisplay()
の定義を
👇
____________________________________
class Character{
public:
virtual void characterdisplay()=0;
};
//🌞virtual void characterdisplay()は純粋仮想関数なので定義を記述していません
____________________________________
とします
親クラスCharacterのメンバ関数characterdisplay()
は純粋仮想関数に設定されています
純粋仮想関数が設定されているので親クラスCharacterは抽象クラスです
そして
1つ目の
子クラスである
CircleCharacterのクラス宣言と
子クラスCircleCharacterのメンバ関数
characterdisplay()
の定義を
👇
_____________________________________________________________________
class CircleCharacter:public Character
{
public:
void characterdisplay();//🌞親クラスCircleのメンバ関characterdisplay()をオーバーライドしています
};
void CircleCharacter::characterdisplay(){
cout << "〇" ;
}
____________________________________
とします。」
マックス「子クラスCircleCharacter(〇文字クラス)は
〇
を
コマンドプロンプト画面に表示する機能を持っているクラスというわけか」
ソーラー「子クラスCircleCharacter型のオブジェクト宣言
CircleCharacter circle1;
を実行し
生成される
子クラスCircleCharacter型のオブジェクトcircle1のメンバ関数
circle1 characterdisplay();
を実行すると
オーバーライドの働きにより
親クラスCharacterのメンバ関数
characterdisplay()
の定義のかわりに
子クラスCircleCharacterのメンバ関数
characterdisplay()
の定義
void CircleCharacter::characterdisplay(){
cout << "〇" ;
}
が用いられたものが実行されることになります
cout << "〇" ;
が実行されるので
〇がコマンドプロンプト画面に表示されます。」
次に
2つ目の
子クラスである
StarCharacterのクラス宣言と
子クラスStarCharacterのメンバ関数
characterdisplay()
の定義を
👇
_____________________________________________________________________
class StarCharacter:public Character
{
public:
void characterdisplay();//🌞親クラスCircleのメンバ関characterdisplay()をオーバーライドしています
};
void StarCharacter::characterdisplay(){
cout << "☆" ;
}
____________________________________
とします。」
マックス「子クラスStarCharacter(☆文字クラス)は
☆
をコマンドプロンプト画面に表示する機能を持っているクラスというわけか」
ソーラー「子クラスStarCharacter型のオブジェクト宣言
StarCharacter star1;
を実行し
生成される
子クラスStarCharacter型のオブジェクトstar1のメンバ関数
star1 characterdisplay();
を実行すると
オーバーライドの働きにより
親クラスCharacterのメンバ関数
void characterdisplay()
の定義のかわりに
子クラスStarCharacterのメンバ関数
characterdisplay()
の定義が
用いられたものが実行されることになります
子クラスStarCharacterのメンバ関数
characterdisplay()
の定義
void StarCharacter::characterdisplay(){
cout << "☆" ;
}
が用いられたものが実行されることになります
cout << "☆" ;
が実行されるので
☆がコマンドプロンプト画面に表示されます。」
ソーラー「
3つ目の
子クラスである
SquareCharacterのクラス宣言と
子クラスSquareCharacterのメンバ関数
void characterdisplay()
の定義を
👇
_____________________________________________________________________
class SquareCharacter:public Character
{
public:
void characterdisplay();//🌞親クラスCircleのメンバ関characterdisplay()をオーバーライドしています
};
void SquareCharacter::characterdisplay(){
cout << "□" ;
}
____________________________________
とします。」
マックス「子クラスSquareCharacter(□クラス)は
□
をコマンドプロンプト画面に表示する機能を持っているクラスというわけか」
ソーラー「子クラスSquareCharacter型のオブジェクト宣言
SquareCharacter square1;
を実行し
生成される
子クラスSquareCharacter型のオブジェクトsquare1のメンバ関数
square1 characterdisplay();
を実行すると
オーバーライドの働きにより
親クラスCharacterのメンバ関数
characterdisplay()
の定義のかわりに
子クラスSquareCharacterのメンバ関数
characterdisplay()
定義が用いられたものが実行されることになります
子クラスSquareCharacterのメンバ関数の定義は
👇
void SquareCharacter::characterdisplay(){
cout << "□" ;
}
👆
なので
cout << "□" ;
が実行され
□がコマンドプロンプト画面に表示されます。」
ソーラー「これらのクラスを用いて
今度は
〇〇☆□〇□
☆□〇☆〇☆
☆□☆〇□〇
をコマンドプロンプト画面に表示してみます
そのプログラムはこちらとなります。
👇
#include <iostream>
using namespace std;
class Character {
public:
virtual void characterdisplay()= 0;
};
//🌞virtual void characterdisplay()は純粋仮想関数なので定義を記述していません
class CircleCharacter:public Character
{
public:
void characterdisplay();//🌞親クラスCircleのメンバ関characterdisplay()をオーバーライドしています
};
void CircleCharacter::characterdisplay() {
cout << "〇";
}
class StarCharacter :public Character
{
public:
void characterdisplay();//🌞親クラスCircleのメンバ関characterdisplay()をオーバーライドしています
};
void StarCharacter::characterdisplay() {
cout << "☆";
}
class SquareCharacter:public Character
{
public:
void characterdisplay();//🌞親クラスCircleのメンバ関characterdisplay()をオーバーライドしています
};
void SquareCharacter::characterdisplay() {
cout << "□";
}
int main() {
CircleCharacter circle;
StarCharacter star;
SquareCharacter square;
circle.characterdisplay();
circle.characterdisplay();
star.characterdisplay();
square.characterdisplay();
circle.characterdisplay();
square.characterdisplay();
cout << "\n";
star.characterdisplay();
square.characterdisplay();
circle.characterdisplay();
star.characterdisplay();
circle.characterdisplay();
star.characterdisplay();
cout << "\n";
star.characterdisplay();
square.characterdisplay();
star.characterdisplay();
circle.characterdisplay();
square.characterdisplay();
circle.characterdisplay();
cout << "\n";
return 0;
}
プログラムの実行結果
〇〇☆□〇□
☆□〇☆〇☆
☆□☆〇□〇
ソーラー「さて
ここで
プログラムの実行結果に表示される絵文字の順番を
1→→→→→
〇〇☆□〇□
2→→→→→
☆□〇☆〇☆
3→→→→→
☆□☆〇□〇
(1,2,3の順に表示されています)
から
←←←←←3
〇〇☆□〇□
←←←←←2
☆□〇☆〇☆
←←←←←1
☆□☆〇□〇
のように
先頭から最後まで表示される絵文字の順番を
最後から先頭へと表示される順番に並べ替えてみたいと思います
つまり
コマンドプロンプト画面に
〇〇☆□〇□
☆□〇☆〇☆
☆□☆〇□〇
の
絵文字の表示が表示されている状態から
最後の絵文字から最初の絵文字へと
順に並び替えられた状態の
〇□〇☆□☆
☆〇☆〇□☆
□〇□☆〇〇
を表示したいというわけです
そのことを達成するプログラムはどのように記述したらよいでしょうか?」
マックス「ビルド実行結果を
〇〇☆□〇□
☆□〇☆〇☆
☆□☆〇□〇
から
〇□〇☆□☆
☆〇☆〇□☆
□〇□☆〇〇
に
変更か・・・・・
うむぅ むう・・・」
ソーラー「
原理的にはとても簡単です
今のプログラムの
circle.characterdisplay();
circle.characterdisplay();
star.characterdisplay();
square.characterdisplay();
circle.characterdisplay();
square.characterdisplay();
cout << "\n";
star.characterdisplay();
square.characterdisplay();
circle.characterdisplay();
star.characterdisplay();
circle.characterdisplay();
star.characterdisplay();
cout << "\n";
star.characterdisplay();
square.characterdisplay();
star.characterdisplay();
circle.characterdisplay();
square.characterdisplay();
circle.characterdisplay();
cout << "\n";
の順番を
〇□〇☆□☆
☆〇☆〇□☆
□〇□☆〇〇
が表示されるように
circle.characterdisplay();
square.characterdisplay();
circle.characterdisplay();
star.characterdisplay();
square.characterdisplay();
star.characterdisplay();
cout << "\n";
star.characterdisplay();
circle.characterdisplay();
star.characterdisplay();
circle.characterdisplay();
square.characterdisplay();
star.characterdisplay();
cout << "\n";
square.characterdisplay();
circle.characterdisplay();
square.characterdisplay();
star.characterdisplay();
circle.characterdisplay();
circle.characterdisplay();
cout << "\n";
にいれかえれば
いいだけです」
マックス「ただ
後ろの命令文から最初の命令文へと並びかえなおしただけか~い
☆ ☆ ☆
以下の矢印の流れに沿って命令文が実行されていますが
circle.characterdisplay();↓
square.characterdisplay();↓
circle.characterdisplay();↓
star.characterdisplay();↓
square.characterdisplay();↓
star.characterdisplay();↓
star.characterdisplay();↓
circle.characterdisplay();↓
star.characterdisplay();↓
circle.characterdisplay();↓
square.characterdisplay();↓
star.characterdisplay();↓
square.characterdisplay();↓
circle.characterdisplay();↓
square.characterdisplay();↓
star.characterdisplay();↓
circle.characterdisplay();↓
circle.characterdisplay();↓
以下の矢印の流れに沿って命令文が実行されるようにするというわけですね
circle.characterdisplay();↑
square.characterdisplay();↑
circle.characterdisplay();↑
star.characterdisplay();↑
square.characterdisplay();↑
star.characterdisplay();↑
star.characterdisplay();↑
circle.characterdisplay();↑
star.characterdisplay();↑
circle.characterdisplay();↑
square.characterdisplay();↑
star.characterdisplay();↑
square.characterdisplay();↑
circle.characterdisplay();↑
square.characterdisplay();↑
star.characterdisplay();↑
circle.characterdisplay();↑
circle.characterdisplay();↑
solarplexussより
☆ ☆ ☆
だが ちょっち💦
めんどくないか・・・」
ソーラー「そのときのプログラムを実行してみたいと思います」
そのプログラムはこちらです
👇
#include <iostream>
using namespace std;
class Character {
public:
virtual void characterdisplay() = 0;
};
//🌞virtual void characterdisplay()は純粋仮想関数なので定義を記述していません
class CircleCharacter :public Character
{
public:
void characterdisplay();//🌞親クラスCircleのメンバ関characterdisplay()をオーバーライドしています
};
void CircleCharacter::characterdisplay() {
cout << "〇";
}
class StarCharacter :public Character
{
public:
void characterdisplay();//🌞親クラスCircleのメンバ関characterdisplay()をオーバーライドしています
};
void StarCharacter::characterdisplay() {
cout << "☆";
}
class SquareCharacter :public Character
{
public:
void characterdisplay();//🌞親クラスCircleのメンバ関characterdisplay()をオーバーライドしています
};
void SquareCharacter::characterdisplay() {
cout << "□";
}
int main() {
CircleCharacter circle;
StarCharacter star;
SquareCharacter square;
circle.characterdisplay();
square.characterdisplay();
circle.characterdisplay();
star.characterdisplay();
square.characterdisplay();
star.characterdisplay();
cout << "\n";
star.characterdisplay();
circle.characterdisplay();
star.characterdisplay();
circle.characterdisplay();
square.characterdisplay();
star.characterdisplay();
cout << "\n";
square.characterdisplay();
circle.characterdisplay();
square.characterdisplay();
star.characterdisplay();
circle.characterdisplay();
circle.characterdisplay();
return 0;
}
ビルド実行結果
〇□〇☆□☆
☆〇☆〇□☆
□〇□☆〇〇
マックス「うう、むうぅ
〇〇☆□〇□
☆□〇☆〇☆
☆□☆〇□〇
から
〇□〇☆□☆
☆〇☆〇□☆
□〇□☆〇〇
に表示をいれかえることができたが・・・
絵文字の入れ替えは簡単ではない・・かんじだな」
ソーラー「今度は
今、行われたことを
ポリモーフィズムを用いて
実行してみたいと思います
まずは
〇〇☆□〇□
☆□〇☆〇☆
☆□☆〇□〇
を表示してから
〇□〇☆□☆
☆〇☆〇□☆
□〇□☆〇〇
を表示してみたいと思います
まずは
〇〇☆□〇□
☆□〇☆〇☆
☆□☆〇□〇
を表示するプログラムです
👇
#include <iostream>
using namespace std;
class Character {
public:
virtual void characterdisplay()= 0;
};
//🌞virtual void characterdisplay()は純粋仮想関数なので定義を記述していません
class CircleCharacter:public Character
{
public:
void characterdisplay();//🌞親クラスCircleのメンバ関characterdisplay()をオーバーライドしています
};
void CircleCharacter::characterdisplay() {
cout << "〇";
}
class StarCharacter :public Character
{
public:
void characterdisplay();//🌞親クラスCircleのメンバ関characterdisplay()をオーバーライドしています
};
void StarCharacter::characterdisplay() {
cout << "☆";
}
class SquareCharacter:public Character
{
public:
void characterdisplay();//🌞親クラスCircleのメンバ関characterdisplay()をオーバーライドしています
};
void SquareCharacter::characterdisplay() {
cout << "□";
}
int main() {
CircleCharacter circle;
StarCharacter star;
SquareCharacter square;
Character* a[18];
a[0]=&circle;
a[1]=&circle;
a[2]=☆
a[3]=□
a[4]=&circle;
a[5]=□
a[6]=☆
a[7]=□
a[8]=&circle;
a[9]=☆
a[10]=&circle;
a[11]=☆
a[12]=☆
a[13]=□
a[14]=☆
a[15]=&circle;
a[16]=□
a[17]=&circle;
a[0]->characterdisplay();
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
return 0;
}
プログラムの実行結果
〇〇☆□〇□
☆□〇☆〇☆
☆□☆〇□〇
ソーラー「このプログラムでは
circleの子クラスCircleCharacter型のオブジェクト宣言
CircleCharacter circle;
starの子クラスStarCharacter型のオブジェクト宣言
StarCharacter star;
squareの子クラスSquareCharacter型のオブジェクト宣言
SquareCharacter square;
を実行して
子クラスCircleCharacter型のオブジェクトcircle
子クラスStarCharacter型のオブジェクトstar
子クラスSquareCharacter型のオブジェクトsquare
を生成しています
その
子クラスCircleCharacter型のオブジェクトcircle
子クラスStarCharacter型のオブジェクトstar
子クラスSquareCharacter型のオブジェクトsquare
の
アドレス
&circle
&star
&square
を
親クラスCharacter*型のポインタ変数の配列宣言
Character* a[18];
により生成される配列変数
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]
a[10]
a[11]
a[12]
a[13]
a[14]
a[15]
a[16]
a[17]
に
a[0]=&circle;
a[1]=&circle;
a[2]=☆
a[3]=□
a[4]=&circle;
a[5]=□
a[6]=☆
a[7]=□
a[8]=&circle;
a[9]=☆
a[10]=&circle;
a[11]=☆
a[12]=☆
a[13]=□
a[14]=☆
a[15]=&circle;
a[16]=□
a[17]=&circle;
と
代入しています
ですので
a[0]->characterdisplay();
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
が実行されると
親クラスCharacterのメンバ関数characterdisplay()が純粋仮想関数に設定されていて
かつ
親クラスCharacterのメンバ関数characterdisplay()が
子クラスCircleCharacterのメンバ関数characterdisplay()
子クラスStarCharacterのメンバ関数characterdisplay()
子クラスSquareCharacterのメンバ関数characterdisplay()
によって
オーバーライド
されているので
a[0]->
a[1]->
a[2]->
a[3]->
a[4]->
a[5]->
a[6]->
a[7]->
a[8]->
a[9]->
a[10]->
a[11]->
a[12]->
a[13]->
a[14]->
a[15]->
a[16]->
a[17]->
は
親クラスCharacterのメンバ関数characterdisplay()の定義にアクセスせず
a[0]->は
子クラスCircleCharacterのメンバ関数characterdisplay()の定義に
a[1]->は
子クラスStarCharacterのメンバ関数characterdisplay()の定義に
a[2]->は
子クラスStarCharacterのメンバ関数characterdisplay()の定義に
a[3]->は
子クラスSquareCharacterのメンバ関数characterdisplay()の定義に
a[4]->は
子クラスCircleCharacterのメンバ関数characterdisplay()の定義に
a[5]->は
子クラスSquareCharacterのメンバ関数characterdisplay()の定義に
a[6]->は
子クラスStarCharacterのメンバ関数characterdisplay()の定義に
a[7]->は
子クラスSquareCharacterのメンバ関数characterdisplay()の定義に
a[8]->は
子クラスCircleCharacterのメンバ関数characterdisplay()の定義に
a[9]->は
子クラスStarCharacterのメンバ関数characterdisplay()の定義に
a[10]->は
子クラスCircleCharacterのメンバ関数characterdisplay()の定義に
a[11]->は
子クラスStarCharacterのメンバ関数characterdisplay()の定義に
a[12]->は
子クラスStarCharacterのメンバ関数characterdisplay()の定義に
a[13]->は
子クラスSquareCharacterのメンバ関数characterdisplay()の定義に
a[14]->は
子クラスStarCharacterのメンバ関数characterdisplay()の定義に
a[15]->は
子クラスCircleCharacterのメンバ関数characterdisplay()の定義に
a[16]->は
子クラスSquareCharacterのメンバ関数characterdisplay()の定義に
a[17]->は
子クラスCircleCharacterのメンバ関数characterdisplay()の定義に
アクセスすることになります
すなわち
アドレス&circle
が代入された
配列変数は
子クラスCircleCharacterのメンバ関数characterdisplay()の定義
👇
void CircleCharacter::characterdisplay() {
cout << "〇";
}
にアクセスし
アドレス&star
が代入された
配列変数は
子クラスStarCharacterのメンバ関数characterdisplay()の定義
👇
void StarCharacter::characterdisplay() {
cout << "☆";
}
にアクセスし
アドレス&square
が代入された
配列変数は
子クラスSquareCharacterのメンバ関数characterdisplay()の定義
void SquareCharacter::characterdisplay() {
cout << "□";
}
にアクセスすることになるので
a[0]->characterdisplay();
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
が実行されると
プログラムの実行結果
〇〇☆□〇□
☆□〇☆〇☆
☆□☆〇□〇
が表示されることになります
この
プログラムの実行結果を
〇〇☆□〇□
☆□〇☆〇☆
☆□☆〇□〇
から
〇□〇☆□☆
☆〇☆〇□☆
□〇□☆〇〇
が表示されるよう
プログラムを変更してみたいと思います
表示される絵文字の順番を
1→→→→→
〇〇☆□〇□
2→→→→→
☆□〇☆〇☆
3→→→→→
☆□☆〇□〇
(1,2,3と表示されていきます)
から
←←←←←3
〇〇☆□〇□
←←←←←2
☆□〇☆〇☆
←←←←←1
☆□☆〇□〇
のように
先頭から最後までの絵文字の順番を
ポリモーフィズム
を用いて
最後から先頭へと順番を並べ替えて表示してみたいというわけです」
マックス「さすがに
これは
難しいんじゃないか」
ソーラー「意外と簡単です
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]
a[10]
a[11]
a[12]
a[13]
a[14]
a[15]
a[16]
a[17]
に
a[17]
a[16]
a[15]
a[14]
a[13]
a[12]
a[11]
a[10]
a[9]
a[8]
a[7]
a[6]
a[5]
a[4]
a[3]
a[2]
a[1]
a[0]
の格納しているアドレスを代入して
a[0]->characterdisplay();
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
の形はかえないように
そのまま
実行すればいいだけです
a[0]->characterdisplay();
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
の形は変えないというのがポイントですね
形をかえないまま
違う関数(命令文)を実行できるということは
プログラムのこの部分は
👇
a[0]->characterdisplay();
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
👆
ポリモーフィズム(多態性)
を備えているというわけです
(^_-)-☆ (^_-)-☆ (^_-)-☆ (^_-)-☆ (^_-)-☆
ところでご注意ください
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]
a[10]
a[11]
a[12]
a[13]
a[14]
a[15]
a[16]
a[17]
に
a[17]
a[16]
a[15]
a[14]
a[13]
a[12]
a[11]
a[10]
a[9]
a[8]
a[7]
a[6]
a[5]
a[4]
a[3]
a[2]
a[1]
a[0]
の格納しているアドレスを代入するのに
a[0]=a[17];
a[1]=a[16];
a[2]=a[15];
a[3]=a[14];
a[4]=a[13];
a[5]=a[12];
a[6]=a[11];
a[7]=a[10];
a[8]=a[9];
a[9]=a[8];
a[10]=a[7];
a[11]=a[6];
a[12]=a[5];
a[13]=a[4];
a[14]=a[3];
a[15]=a[2];
a[16]=a[1];
a[17]=a[0];
を実行したらいけないんです
なぜなら
a[0]=a[17];
a[1]=a[16];
a[2]=a[15];
a[3]=a[14];
a[4]=a[13];
a[5]=a[12];
a[6]=a[11];
a[7]=a[10];
a[8]=a[9];
までは
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
に
a[17]
a[16]
a[15]
a[14]
a[13]
a[12]
a[11]
a[10]
a[9]
がもとから格納しているアドレスが代入されますが
a[9]=a[8];
a[10]=a[7];
a[11]=a[6];
a[12]=a[5];
a[13]=a[4];
a[14]=a[3];
a[15]=a[2];
a[16]=a[1];
a[17]=a[0];
は
a[9]
a[8]
a[7]
a[6]
a[5]
a[4]
a[3]
a[2]
a[1]
a[0]
に
a[8]
a[7]
a[6]
a[5]
a[4]
a[3]
a[2]
a[1]
a[0]
がもとから格納しているアドレスが代入されることにはなりません
なぜなら
a[0]=a[17];
a[1]=a[16];
a[2]=a[15];
a[3]=a[14];
a[4]=a[13];
a[5]=a[12];
a[6]=a[11];
a[7]=a[10];
a[8]=a[9];
が実行されているので
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
がもとから格納しているアドレスは
a[17]
a[16]
a[15]
a[14]
a[13]
a[12]
a[11]
a[10]
a[9]
の格納しているアドレスによって上書きされてなくなっています
実際のところ
a[9]=a[8];
a[10]=a[7];
a[11]=a[6];
a[12]=a[5];
a[13]=a[4];
a[14]=a[3];
a[15]=a[2];
a[16]=a[1];
a[17]=a[0];
は
a[9]=a[9];
a[10]=a[10];
a[11]=a[11];
a[12]=a[12];
a[13]=a[13];
a[14]=a[14];
a[15]=a[15];
a[16]=a[16];
a[17]=a[17];
が実行されることになります
つまり
a[9]
a[10]
a[11]
a[12]
a[13]
a[14]
a[15]
a[16]
a[17]
に
a[9]
a[10]
a[11]
a[12]
a[13]
a[14]
a[15]
a[16]
a[17]
が元から格納しているアドレスが代入されることになります
a[9]
a[10]
a[11]
a[12]
a[13]
a[14]
a[15]
a[16]
a[17]
に
a[8]
a[7]
a[6]
a[5]
a[4]
a[3]
a[2]
a[1]
a[0]
がもとから格納しているアドレスが代入されることにはなりません
そこで
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]
a[10]
a[11]
a[12]
a[13]
a[14]
a[15]
a[16]
a[17]
に
a[17]
a[16]
a[15]
a[14]
a[13]
a[12]
a[11]
a[10]
a[9]
a[8]
a[7]
a[6]
a[5]
a[4]
a[3]
a[2]
a[1]
a[0]
の格納しているアドレスを代入するのに
まず
別の親クラスCharacter*型のポインタ変数の配列宣言
Character* b[18];
を実行し
生成される配列変数
b[1]
b[2]
b[3]
b[4]
b[5]
b[6]
b[7]
b[8]
b[9]
b[10]
b[11]
b[12]
b[13]
b[14]
b[15]
b[16]
b[17]
に
a[17]
a[16]
a[15]
a[14]
a[13]
a[12]
a[11]
a[10]
a[9]
a[8]
a[7]
a[6]
a[5]
a[4]
a[3]
a[2]
a[1]
a[0]
を代入する
b[0]=a[17];
b[1]=a[16];
b[2]=a[15];
b[3]=a[14];
b[4]=a[13];
b[5]=a[12];
b[6]=a[11];
b[7]=a[10];
b[8]=a[9];
b[9]=a[8];
b[10]=a[7];
b[11]=a[6];
b[12]=a[5];
b[13]=a[4];
b[14]=a[3];
b[15]=a[2];
b[16]=a[1];
b[17]=a[0];
を実行します
その後
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]
a[10]
a[11]
a[12]
a[13]
a[14]
a[15]
a[16]
a[17]
に
b[1]
b[2]
b[3]
b[4]
b[5]
b[6]
b[7]
b[8]
b[9]
b[10]
b[11]
b[12]
b[13]
b[14]
b[15]
b[16]
b[17]
を代入すれば
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]
a[10]
a[11]
a[12]
a[13]
a[14]
a[15]
a[16]
a[17]
に
a[17]
a[16]
a[15]
a[14]
a[13]
a[12]
a[11]
a[10]
a[9]
a[8]
a[7]
a[6]
a[5]
a[4]
a[3]
a[2]
a[1]
a[0]
の格納しているアドレスが代入されることになります
今行われたことを
配列とfor文を用いて表すと以下のようになります
👇
Character* b[18];
int i;
for (i = 0; i<18; i++) {
b[17 - i] = a[i];
}
int j;
for (j = 0; j<18; j++) {
a[j] = b[j];
}
どうかな?
(^_-)-☆ (^_-)-☆ (^_-)-☆ (^_-)-☆ (^_-)-☆
では
そのプログラムを実行してみたいと思います
👇
#include <iostream>
using namespace std;
class Character {
public:
virtual void characterdisplay() = 0;
};
//🌞virtual void characterdisplay()は純粋仮想関数なので定義を記述していません
class CircleCharacter :public Character
{
public:
void characterdisplay();//🌞親クラスCircleのメンバ関数characterdisplay()をオーバーライドしています
};
void CircleCharacter::characterdisplay() {
cout << "〇";
}
class StarCharacter :public Character
{
public:
void characterdisplay();//🌞親クラスCircleのメンバ関数characterdisplay()をオーバーライドしています
};
void StarCharacter::characterdisplay() {
cout << "☆";
}
class SquareCharacter :public Character
{
public:
void characterdisplay();//🌞親クラスCircleのメンバ関数characterdisplay()をオーバーライドしています
};
void SquareCharacter::characterdisplay() {
cout << "□";
}
int main() {
CircleCharacter circle;
StarCharacter star;
SquareCharacter square;
Character* a[18];
a[0] = &circle;
a[1] = &circle;
a[2] = ☆
a[3] = □
a[4] = &circle;
a[5] = □
a[6] = ☆
a[7] = □
a[8] = &circle;
a[9] = ☆
a[10] = &circle;
a[11] = ☆
a[12] = ☆
a[13] = □
a[14] = ☆
a[15] = &circle;
a[16] = □
a[17] = &circle;
Character* b[18];
int i;
for (i = 0; i<18; i++) {
b[17 - i] = a[i];
}
int j;
for (j = 0; j<18; j++) {
a[j] = b[j];
}
a[0]->characterdisplay();
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
return 0;
}
プログラムの実行結果
〇□〇☆□☆
☆〇☆〇□☆
□〇□☆〇〇
マックス「おおっ!
〇〇☆□〇□
☆□〇☆〇☆
☆□☆〇□〇
から
〇□〇☆□☆
☆〇☆〇□☆
□〇□☆〇〇
に
いれかわった!
やるな
👇
a[0]->characterdisplay();
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
👆
この部分は変更なしか😊
んん??
ポリモーフィズム
を使わなくてもいいんじゃないか?
ようは
a[0]->characterdisplay();
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
なら
プログラムの実行結果
〇〇☆□〇□
☆□〇☆〇☆
☆□☆〇□〇
が表示されるんだろう
これを
〇□〇☆□☆
☆〇☆〇□☆
□〇□☆〇〇
のように
最後の絵文字から最初の絵文字へと表示されるようにしたいなら
a[17]->characterdisplay();
a[16]->characterdisplay();
a[15]->characterdisplay();
a[14]->characterdisplay();
a[13]->characterdisplay();
a[12]->characterdisplay();
cout << "\n";
a[11]->characterdisplay();
a[10]->characterdisplay();
a[9]->characterdisplay();
a[8]->characterdisplay();
a[7]->characterdisplay();
a[6]->characterdisplay();
cout << "\n";
a[5]->characterdisplay();
a[4]->characterdisplay();
a[3]->characterdisplay();
a[2]->characterdisplay();
a[1]->characterdisplay();
a[0]->characterdisplay();
cout << "\n";
を
🐈🐈🐈実行すればいいだけだろう🐈🐈🐈
その方が簡単なんじゃないか
そうすれば
プログラムの実行結果
〇□〇☆□☆
☆〇☆〇□☆
□〇□☆〇〇
が表示されるわけだ
ふっ そうだな
a[0]->characterdisplay();
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
は
なんか、こう(*^。^*)
int i;
for (i = 0; i<18; i++) {
a[i]->characterdisplay();
}
を使って表せるんじゃないか?
だったら
a[17]->characterdisplay();
a[16]->characterdisplay();
a[15]->characterdisplay();
a[14]->characterdisplay();
a[13]->characterdisplay();
a[12]->characterdisplay();
cout << "\n";
a[11]->characterdisplay();
a[10]->characterdisplay();
a[9]->characterdisplay();
a[8]->characterdisplay();
a[7]->characterdisplay();
a[6]->characterdisplay();
cout << "\n";
a[5]->characterdisplay();
a[4]->characterdisplay();
a[3]->characterdisplay();
a[2]->characterdisplay();
a[1]->characterdisplay();
a[0]->characterdisplay();
cout << "\n";
も
int i;
for (i = 0; i<18; i++) {
a[18-i]->characterdisplay();
}
を使ってあらわせるんじゃないか?
int i;
for (i = 0; i<18; i++) {
a[18-i]->characterdisplay();
}
をプログラムに使った方が
わざわざ
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]
a[10]
a[11]
a[12]
a[13]
a[14]
a[15]
a[16]
a[17]
に
a[17]
a[16]
a[15]
a[14]
a[13]
a[12]
a[11]
a[10]
a[9]
a[8]
a[7]
a[6]
a[5]
a[4]
a[3]
a[2]
a[1]
a[0]
の格納しているアドレスを代入して
a[0]->characterdisplay();
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
の形はかえないそのまま
実行するということをしなくてもいいんじゃないか
つまり
ポリモーフィズム
をもちいなくてもいいんじゃないか?」
ソーラー「それが
そう簡単にはいかないんです
なぜなら
a[17]->characterdisplay();
a[16]->characterdisplay();
a[15]->characterdisplay();
a[14]->characterdisplay();
a[13]->characterdisplay();
a[12]->characterdisplay();
cout << "\n";
a[11]->characterdisplay();
a[10]->characterdisplay();
a[9]->characterdisplay();
a[8]->characterdisplay();
a[7]->characterdisplay();
a[6]->characterdisplay();
cout << "\n";
a[5]->characterdisplay();
a[4]->characterdisplay();
a[3]->characterdisplay();
a[2]->characterdisplay();
a[1]->characterdisplay();
a[0]->characterdisplay();
cout << "\n";
には
cout << "\n";
が含まれています
ですから
int i;
for (i = 0; i<18; i++) {
a[17-i]->characterdisplay();
}
を改良しないと
int i;
for (i = 0; i<18; i++) {
a[17-i]->characterdisplay();
}
を用いて
a[17]->characterdisplay();
a[16]->characterdisplay();
a[15]->characterdisplay();
a[14]->characterdisplay();
a[13]->characterdisplay();
a[12]->characterdisplay();
cout << "\n";
a[11]->characterdisplay();
a[10]->characterdisplay();
a[9]->characterdisplay();
a[8]->characterdisplay();
a[7]->characterdisplay();
a[6]->characterdisplay();
cout << "\n";
a[5]->characterdisplay();
a[4]->characterdisplay();
a[3]->characterdisplay();
a[2]->characterdisplay();
a[1]->characterdisplay();
a[0]->characterdisplay();
cout << "\n";
を表現することはできません
なかなか手間がかかります
それに対し
ポリモーフィズム
が用いられた場合は
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]
a[10]
a[11]
a[12]
a[13]
a[14]
a[15]
a[16]
a[17]
に
に格納されるアドレスを変更すればいいだけなので
a[0]->characterdisplay();
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
の形はかえないでそのまま実行することで
a[17]->characterdisplay();
a[16]->characterdisplay();
a[15]->characterdisplay();
a[14]->characterdisplay();
a[13]->characterdisplay();
a[12]->characterdisplay();
cout << "\n";
a[11]->characterdisplay();
a[10]->characterdisplay();
a[9]->characterdisplay();
a[8]->characterdisplay();
a[7]->characterdisplay();
a[6]->characterdisplay();
cout << "\n";
a[5]->characterdisplay();
a[4]->characterdisplay();
a[3]->characterdisplay();
a[2]->characterdisplay();
a[1]->characterdisplay();
a[0]->characterdisplay();
が実行されることに
することができるんです
cout << "\n";
が記述されていることは関係ありません
ポリモーフィズム
を用いると
cout << "\n";のような他の命令文の存在に関係なく
狙った関数だけを
別の関数に書き換えることができるからです
そこが
ポリモーフィズム(多態性)の優れている点なのですね」
おまけ
確かに
int i;
for (i = 0; i<18; i++) {
a[i]->characterdisplay();
}
を改良したものを用いれば
a[0]->characterdisplay();
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
を表現することができ
int i;
for (i = 0; i<18; i++) {
a[17-i]->characterdisplay();
}
を改良したものを用いれば
a[17]->characterdisplay();
a[16]->characterdisplay();
a[15]->characterdisplay();
a[14]->characterdisplay();
a[13]->characterdisplay();
a[12]->characterdisplay();
cout << "\n";
a[11]->characterdisplay();
a[10]->characterdisplay();
a[9]->characterdisplay();
a[8]->characterdisplay();
a[7]->characterdisplay();
a[6]->characterdisplay();
cout << "\n";
a[5]->characterdisplay();
a[4]->characterdisplay();
a[3]->characterdisplay();
a[2]->characterdisplay();
a[1]->characterdisplay();
a[0]->characterdisplay();
cout << "\n";
を表現することができます
つまり
プログラムの実行結果
〇〇☆□〇□
☆□〇☆〇☆
☆□☆〇□〇
を
入れ替えて
〇□〇☆□☆
☆〇☆〇□☆
□〇□☆〇〇
を表示することができます
ですが
以下のように
a[0]->characterdisplay();
cout << "\n";
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
cout << "\n";
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
cout << "\n";
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "😸"<<"\n";
cout << "\n";
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
cout << "\n";
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
🍅ランダムに🍅
cout << "\n";
や
cout << "😸"<<"\n";
が
挟み込まれていると
👆
この命令文を
int i;
for (i = 0; i<18; i++) {
a[17-i]->characterdisplay();
}
を用いて表すのはとても難しくなります
(😊実はその方法があるんです😊)
同様に
もちろん
a[0]->characterdisplay();
cout << "\n";
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
cout << "\n";
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
cout << "\n";
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "😸"<<"\n";
cout << "\n";
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
cout << "\n";
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
の
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
a[6]->characterdisplay();
a[7]->characterdisplay();
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
の部分だけを
a[17]->characterdisplay();
a[16]->characterdisplay();
a[15]->characterdisplay();
a[14]->characterdisplay();
a[13]->characterdisplay();
a[12]->characterdisplay();
a[11]->characterdisplay();
a[10]->characterdisplay();
a[9]->characterdisplay();
a[8]->characterdisplay();
a[7]->characterdisplay();
a[6]->characterdisplay();
a[5]->characterdisplay();
a[4]->characterdisplay();
a[3]->characterdisplay();
a[2]->characterdisplay();
a[1]->characterdisplay();
a[0]->characterdisplay();
のように入れ替えた
a[17]->characterdisplay();
cout << "\n";
a[16]->characterdisplay();
a[15]->characterdisplay();
a[14]->characterdisplay();
a[13]->characterdisplay();
a[12]->characterdisplay();
cout << "\n";
cout << "\n";
cout << "\n";
a[11]->characterdisplay();
a[10]->characterdisplay();
cout << "\n";
a[9]->characterdisplay();
a[8]->characterdisplay();
a[7]->characterdisplay();
a[6]->characterdisplay();
cout << "😸"<<"\n";
cout << "\n";
cout << "\n";
a[5]->characterdisplay();
a[4]->characterdisplay();
a[3]->characterdisplay();
cout << "\n";
a[2]->characterdisplay();
a[1]->characterdisplay();
a[0]->characterdisplay();
を
int i;
for (i = 0; i<18; i++) {
a[17-i]->characterdisplay();
}
を用いて表現することも難しいのです
しかし
ポリモーフィズム
を用いれば
a[0]->characterdisplay();
cout << "\n";
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
cout << "\n";
cout << "\n";
cout << "\n";
a[6]->characterdisplay();
a[7]->characterdisplay();
cout << "\n";
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
cout << "😸"<<"\n";
cout << "\n";
cout << "\n";
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
cout << "\n";
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
cout << "\n";
の
a[1]->characterdisplay();
a[2]->characterdisplay();
a[3]->characterdisplay();
a[4]->characterdisplay();
a[5]->characterdisplay();
a[6]->characterdisplay();
a[7]->characterdisplay();
a[8]->characterdisplay();
a[9]->characterdisplay();
a[10]->characterdisplay();
a[11]->characterdisplay();
a[12]->characterdisplay();
a[13]->characterdisplay();
a[14]->characterdisplay();
a[15]->characterdisplay();
a[16]->characterdisplay();
a[17]->characterdisplay();
の部分だけを
a[17]->characterdisplay();
a[16]->characterdisplay();
a[15]->characterdisplay();
a[14]->characterdisplay();
a[13]->characterdisplay();
a[12]->characterdisplay();
a[11]->characterdisplay();
a[10]->characterdisplay();
a[9]->characterdisplay();
a[8]->characterdisplay();
a[7]->characterdisplay();
a[6]->characterdisplay();
a[5]->characterdisplay();
a[4]->characterdisplay();
a[3]->characterdisplay();
a[2]->characterdisplay();
a[1]->characterdisplay();
a[0]->characterdisplay();
にいれかえた
a[17]->characterdisplay();
cout << "\n";
a[16]->characterdisplay();
a[15]->characterdisplay();
a[14]->characterdisplay();
a[13]->characterdisplay();
a[12]->characterdisplay();
cout << "\n";
cout << "\n";
cout << "\n";
a[11]->characterdisplay();
a[10]->characterdisplay();
cout << "\n";
a[9]->characterdisplay();
a[8]->characterdisplay();
a[7]->characterdisplay();
a[6]->characterdisplay();
cout << "😸"<<"\n";
cout << "\n";
cout << "\n";
a[5]->characterdisplay();
a[4]->characterdisplay();
a[3]->characterdisplay();
cout << "\n";
a[2]->characterdisplay();
a[1]->characterdisplay();
a[0]->characterdisplay();
に相当するものを実行することは簡単です
a[0]
a[1]
a[2]
a[3]
a[4]
a[5]
a[6]
a[7]
a[8]
a[9]
a[10]
a[11]
a[12]
a[13]
a[14]
a[15]
a[16]
a[17]
に
a[17]
a[16]
a[15]
a[14]
a[13]
a[12]
a[11]
a[10]
a[9]
a[8]
a[7]
a[6]
a[5]
a[4]
a[3]
a[2]
a[1]
a[0]
の格納しているアドレスを代入するだけで済むので
とても
簡単ですね」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます