CPP03 1.0
読み取り中…
検索中…
一致する文字列を見つけられません
C++ Module 03

Overview

EX00: オブジェクトの生成と基本操作

ClapTrapというロボットクラスを作る。名前や体力を持たせ、攻撃や回復といった動作を実装する。OOPと基本的なクラスの形(Orthodox Canonical Class Form)の一部を実装して、オブジェクトのライフサイクル管理できるようにする。

EX01: 親子関係の導入(継承の基礎)

ClapTrapを「親」として、新しいロボットScavTrapを「子」として作り出す。子は親の基本的な性質を受け継ぎつつ、より特化した機能(ゲートキーパーモード)や異なる初期設定を持つことで少し進化したロボットとして登場する。ここでは、コードの再利用性という継承のメリットを理解し、親クラスの機能を拡張していく経験が得られます。

継承:Inheritance, 派生クラス:Derived Class、基底クラス:Base Class, メソッドのオーバーライド:Method Overriding, protectedアクセス指定子:protected Access Specifier, コンストラクタとデストラクタの連鎖:Constructor and Destructor Chaining

EX02: 兄弟の登場(さらなる特化)

‍今度はScavTrapとは異なる特性を持つFragTrapという「兄弟」のような新しいロボットを作り出す。ClapTrapの基本を受け継ぎながら、独自の機能(ハイタッチ)と異なる設定を持つ。同じ親を持つことなる子たちがそれぞれ異なる個性を持つ様子を理解して、継承が様々なオブジェクトを生み出す仕組みを学ぶ。

EX03: 複雑な関係性(多重継承の挑戦)

‍2つの親FragTrap, ScavTrapの良いところを併せ持つDiamondTrapという「ハイブリッド」なロボットを作り出す。複数の親から特性を受け継ぐ多重継承。ここでは多重継承の持つ力と潜在的な課題を学びます。

まとめ:

‍シンプルなオブジェクト作成から継承のメカニズムを通じてコードの再利用と拡張を体験し、最終的には複数の特性を組み合わせる多重継承という高度な概念へと、段階的に理解度を深めることができます。基本的なロボットから始まって、様々な機能を持つ特殊なロボットへと進化していく物語🤖✨

Project Links

‍Doxygenで作成されたソースコードドキュメントです。

クラスの連携図やソースコードの説明に関する情報がまとめられています。


課題を始める前に

この課題で学ぶ機能や実装がなぜ必要なのか?その仕組みを使うとどうなるのか?歴史的な経緯やその効果に関する情報をまとめる。


ex00 "Aaaaand... OPEN!"

Files :

ClapTrap.hpp , ClapTrap.cpp ,

main.cpp , Makefile ,

内容:

‍* 汎用クラス「ClapTrap」を実装する。

  • オブジェクトはHP, EnergyPoint, AttackDamage(攻撃力)のパラメータを持ち、攻撃・ダメージを受ける・自己修復することができる。
  • ここでは基本的なオブジェクトの形を作ります。

キーワード、メモ:

‍個人的に気になった点:

オブジェクトの宣言と初期化を1行に書くと、コンパイラはコピーコンストラクタを呼び出すように設計されている。

// ClapTrap unit4 = unit1;// this code call copy constructor.
// Copy Assignment.
ClapTrap unit4;
unit4 = unit1;
// Copy Constructor
ClapTrap unit5(unit2);
Represents a basic robot character.
Definition ClapTrap.hpp:34

動作結果

main.cpp
int main() {
ClapTrap unit1("Tank");
ClapTrap unit2("Medic");
ClapTrap unit3;
// ClapTrap unit4 = unit1;// this code call copy constructor.
// Copy Assignment.
ClapTrap unit4;
unit4 = unit1;
// Copy Constructor
ClapTrap unit5(unit2);
unit1.attack("Goblin");
unit2.beRepaired(5);
unit1.takeDamage(3);
unit2.attack("Dragon");
unit3.takeDamage(15);
unit3.beRepaired(2);
unit1.beRepaired(1);
unit2.takeDamage(12);
return 0;
}
void beRepaired(unsigned int amount)
beRepaired function implementation.
Definition ClapTrap.cpp:108
void takeDamage(unsigned int amount)
takeDamage function implementation.
Definition ClapTrap.cpp:89
T endl(T... args)
int main()
Main function.
Definition main.cpp:26
出力
$ ./a.out
ClapTrap String constructor called for Tank
ClapTrap String constructor called for Medic
ClapTrap Default constructor called
ClapTrap Default constructor called
ClapTrap Assignation operator called for Default
ClapTrap Copy constructor called for Medic
ClapTrap Tank attacks Goblin, causing 0 points of damage!
ClapTrap Medic repairs itself, regaining 5 hit points!
ClapTrap Medic now has 15 hit points and 9 energy points.
ClapTrap Tank takes 3 points of damage!
ClapTrap Tank has 7 hit points remaining.
ClapTrap Medic attacks Dragon, causing 0 points of damage!
ClapTrap Default takes 15 points of damage!
ClapTrap Default has died!
ClapTrap Default cannot be repaired as it has no hit points!
ClapTrap Tank repairs itself, regaining 1 hit points!
ClapTrap Tank now has 8 hit points and 8 energy points.
ClapTrap Medic takes 12 points of damage!
ClapTrap Medic has 3 hit points remaining.
ClapTrap Destructor called for Medic
ClapTrap Destructor called for Tank
ClapTrap Destructor called for Default
ClapTrap Destructor called for Medic
ClapTrap Destructor called for Tank

ex01 "Serena, my love!"

Files :

ClapTrap.hpp , ClapTrap.cpp ,

ScavTrap.hpp , ScavTrap.cpp ,

main.cpp , Makefile ,

内容:

‍* 基底クラスClapTrapから派生クラスScavTrapを実装します。(クラスの継承)

  • 派生クラスで実現したい機能

    ScavTrap固有のコンストラクター

    ~ScavTrap(), attack()メソッドのオーバーライド (仮想関数)

    guardGate()メソッドの追加 (`ScavTrap`クラス固有の機能)

キーワード、メモ:

‍* 継承(Inheritance):ex01/ScavTrap.hppより抜粋

class ScavTrap : public ClapTrap {
Represents a ScavTrap robot, a specialized type derived from ClapTrap.
Definition ScavTrap.hpp:38

基底クラス(Base Class): public ClapTrap

派生クラス(Derived Class): class ScavTrap

派生クラスは基底クラスの性質(メンバー変数やメンバー関数)を受け継ぐことができる仕組みで、コードの再利用+基底クラスからの機能拡張のメリットがある。

* protectedアクセス指定子:ex01/ClapTrap.hppより抜粋

protected:
std::string name;
unsigned int hitPoints;
unsigned int energyPoints;
unsigned int attackDamage;

派生クラスScavTrapからメンバー変数に直接アクセスして変更できるようになる。

* Virtual(仮想関数):ex01/ScavTrap.hppより抜粋

virtual void attack(const std::string &target);

メソッドを派生クラスでオーバーライドできる。 (ScavTrap固有のAttack関数を作れる。)

非仮想関数(virtualをつけないメンバー関数)

virtual ~ScavTrap();

基底クラスと派生クラスを仮想デストラクタにすることで、派生クラスのデストラクタが実行時に呼び出され、派生クラス固有雨のクリーンナップ処理が確実に行われ、メモリリークなどの問題を回避できる。

覚え書き
クラス継承とvirtual関数の仕組みと役割について、自分なりの解釈のまとめ。

‍* 派生クラスのオブジェクトは、基底クラスのインターフェース(関数やメンバー変数)を使ってオブジェクトの操作ができる。

  • 派生クラスは基底クラスと異なる振る舞いをさせるために、固有のオブジェクトを作ることができる。
  • そのために、専用のコンストラクターや固有メソッドを実装することや、固有のデストラクターによって安全にリソースの解放ができる。
  • この固有メソッド、固有デストラクターを正しく呼び出すために、virtualメソッドとして定義する必要がある。

    virtualが付いていない同じ名前のメソッドの動作は未定義。 virtualが付いていると同じ名前でメソッドのオーバーライドができる。

    * その他メモ

    仮想関数について / virtual関数のメカニズムは派生オブジェクトが既に存在することが前提

動作結果

main.cpp
int main() {
std::cout << "--- ClapTrap Tests ---" << std::endl;
ClapTrap clapUnit1("BasicBot");
clapUnit1.attack("Wild Smeef");
clapUnit1.takeDamage(5);
clapUnit1.beRepaired(3);
std::cout << "--- ScavTrap Tests ---" << std::endl;
ScavTrap scavUnit1("Guardian");
ScavTrap scavUnit2("LootStalker");
ScavTrap scavUnit3;
ScavTrap scavUnit4 = scavUnit1;
ScavTrap scavUnit5(scavUnit2);
scavUnit1.attack("Bandit");
scavUnit2.takeDamage(15);
scavUnit1.beRepaired(10);
scavUnit2.guardGate();
scavUnit3.attack("Rakk");
scavUnit3.takeDamage(110);
scavUnit4.beRepaired(5);
std::cout << "--- Construction/Destruction Order ---" << std::endl;
{
ScavTrap tempScav("TemporaryBot");
}
return 0;
}
virtual void attack(const std::string &target)
Attack function implementation for ScavTrap.
Definition ScavTrap.cpp:77
出力
$ ./a.out
--- ClapTrap Tests ---
ClapTrap String constructor called for BasicBot
ClapTrap BasicBot attacks Wild Smeef, causing 0 points of damage!
ClapTrap BasicBot takes 5 points of damage!
ClapTrap BasicBot has 5 hit points remaining.
ClapTrap BasicBot repairs itself, regaining 3 hit points!
ClapTrap BasicBot now has 8 hit points and 8 energy points.
--- ScavTrap Tests ---
ClapTrap String constructor called for Guardian
ScavTrap String constructor called for Guardian
ClapTrap String constructor called for LootStalker
ScavTrap String constructor called for LootStalker
ClapTrap Default constructor called
ScavTrap Default constructor called
ClapTrap Copy constructor called for Guardian
ScavTrap Copy constructor called for Guardian
ClapTrap Copy constructor called for LootStalker
ScavTrap Copy constructor called for LootStalker
ScavTrap Guardian attacks Bandit, causing 20 points of damage!
ClapTrap LootStalker takes 15 points of damage!
ClapTrap LootStalker has 85 hit points remaining.
ClapTrap Guardian repairs itself, regaining 10 hit points!
ClapTrap Guardian now has 110 hit points and 48 energy points.
ScavTrap LootStalker has entered Gate keeper mode.
ScavTrap DefaultScav attacks Rakk, causing 20 points of damage!
ClapTrap DefaultScav takes 110 points of damage!
ClapTrap DefaultScav has died!
ClapTrap Guardian repairs itself, regaining 5 hit points!
ClapTrap Guardian now has 105 hit points and 49 energy points.
--- Construction/Destruction Order ---
ClapTrap String constructor called for TemporaryBot
ScavTrap String constructor called for TemporaryBot
ScavTrap Destructor called for TemporaryBot
ClapTrap Destructor called for TemporaryBot
ScavTrap Destructor called for LootStalker
ClapTrap Destructor called for LootStalker
ScavTrap Destructor called for Guardian
ClapTrap Destructor called for Guardian
ScavTrap Destructor called for DefaultScav
ClapTrap Destructor called for DefaultScav
ScavTrap Destructor called for LootStalker
ClapTrap Destructor called for LootStalker
ScavTrap Destructor called for Guardian
ClapTrap Destructor called for Guardian
ClapTrap Destructor called for BasicBot

ex02 "Repetitive work"

Files :

ClapTrap.hpp , ClapTrap.cpp ,

ScavTrap.hpp , ScavTrap.cpp ,

FragTrap.hpp , FragTrap.cpp ,

main.cpp , Makefile ,

内容:

‍* 継承:ClapTrapからFragTrapクラスに継承する。

  • FragTrapはハイタッチする機能を追加する。(フレンドリーなオブジェクト)
  • この課題はクラス継承の反復練習。

キーワード、メモ:

‍* コンストラクター、デストラクタ、代入演算子

  • 仮想関数による関数のオーバーライド
  • 固有のメンバー関数 highFivesGuys()

    std::cout << "FragTrap " << name << " says: \"High fives, anyone?\"" << std::endl;
    }
    void highFivesGuys(void)
    highFivesGuys function implementation for FragTrap.
    Definition FragTrap.cpp:96
    * オーバーライドしていない関数はClapTrapクラスの関数が呼び出される。

動作結果

main.cpp
int main() {
std::cout << "--- ClapTrap Tests ---" << std::endl;
ClapTrap clapUnit1("BasicBot");
clapUnit1.attack("Wild Smeef");
clapUnit1.takeDamage(5);
clapUnit1.beRepaired(3);
std::cout << "--- ScavTrap Tests ---" << std::endl;
ScavTrap scavUnit1("Guardian");
scavUnit1.attack("Bandit");
scavUnit1.takeDamage(15);
scavUnit1.beRepaired(10);
scavUnit1.guardGate();
std::cout << "--- FragTrap Tests ---" << std::endl;
FragTrap fragUnit1("Blitz");
FragTrap fragUnit2("Spark");
FragTrap fragUnit3;
FragTrap fragUnit4 = fragUnit1;
FragTrap fragUnit5(fragUnit2);
fragUnit1.attack("Psycho");
fragUnit2.takeDamage(35);
fragUnit1.beRepaired(20);
fragUnit2.highFivesGuys();
fragUnit3.attack("Skag");
fragUnit3.takeDamage(120);
fragUnit4.beRepaired(15);
std::cout << "--- FragTrap Construction/Destruction Order ---" << std::endl;
{
FragTrap tempFrag("TemporaryFrag");
}
return 0;
}
Represents a FragTrap robot, a specialized type derived from ClapTrap.
Definition FragTrap.hpp:38
virtual void attack(const std::string &target)
Attack function implementation for FragTrap.
Definition FragTrap.cpp:81
出力
$ ./a.out
--- ClapTrap Tests ---
ClapTrap String constructor called for BasicBot
ClapTrap BasicBot attacks Wild Smeef, causing 0 points of damage!
ClapTrap BasicBot takes 5 points of damage!
ClapTrap BasicBot has 5 hit points remaining.
ClapTrap BasicBot repairs itself, regaining 3 hit points!
ClapTrap BasicBot now has 8 hit points and 8 energy points.
--- ScavTrap Tests ---
ClapTrap String constructor called for Guardian
ScavTrap String constructor called for Guardian
ScavTrap Guardian attacks Bandit, causing 20 points of damage!
ClapTrap Guardian takes 15 points of damage!
ClapTrap Guardian has 85 hit points remaining.
ClapTrap Guardian repairs itself, regaining 10 hit points!
ClapTrap Guardian now has 95 hit points and 48 energy points.
ScavTrap Guardian has entered Gate keeper mode.
--- FragTrap Tests ---
ClapTrap String constructor called for Blitz
FragTrap String constructor called for Blitz
ClapTrap String constructor called for Spark
FragTrap String constructor called for Spark
ClapTrap Default constructor called
FragTrap Default constructor called
ClapTrap Copy constructor called for Blitz
FragTrap Copy constructor called for Blitz
ClapTrap Copy constructor called for Spark
FragTrap Copy constructor called for Spark
FragTrap Blitz attacks Psycho, causing 30 points of damage!
ClapTrap Spark takes 35 points of damage!
ClapTrap Spark has 65 hit points remaining.
ClapTrap Blitz repairs itself, regaining 20 hit points!
ClapTrap Blitz now has 120 hit points and 98 energy points.
FragTrap Spark says: "High fives, anyone?"
FragTrap DefaultFrag attacks Skag, causing 30 points of damage!
ClapTrap DefaultFrag takes 120 points of damage!
ClapTrap DefaultFrag has died!
ClapTrap Blitz repairs itself, regaining 15 hit points!
ClapTrap Blitz now has 115 hit points and 99 energy points.
--- FragTrap Construction/Destruction Order ---
ClapTrap String constructor called for TemporaryFrag
FragTrap String constructor called for TemporaryFrag
FragTrap Destructor called for TemporaryFrag
ClapTrap Destructor called for TemporaryFrag
FragTrap Destructor called for Spark
ClapTrap Destructor called for Spark
FragTrap Destructor called for Blitz
ClapTrap Destructor called for Blitz
FragTrap Destructor called for DefaultFrag
ClapTrap Destructor called for DefaultFrag
FragTrap Destructor called for Spark
ClapTrap Destructor called for Spark
FragTrap Destructor called for Blitz
ClapTrap Destructor called for Blitz
ScavTrap Destructor called for Guardian
ClapTrap Destructor called for Guardian
ClapTrap Destructor called for BasicBot

ex03 "Now it’s weird!"

今度は変だ!

Files :

ClapTrap.hpp , ClapTrap.cpp ,

ScavTrap.hpp , ScavTrap.cpp ,

FragTrap.hpp , FragTrap.cpp ,

DiamondTrap.hpp , DiamondTrap.cpp ,

main.cpp , Makefile

内容:

‍* 多重継承とダイヤモンド問題

各クラスの機能まとめ

‍テーブル 1: 各クラスのメンバー変数の初期値

メンバー変数 ClapTrap (デフォルト) ClapTrap (名前指定) ScavTrap (デフォルト) ScavTrap (名前指定) FragTrap (デフォルト) FragTrap (名前指定) DiamondTrap (デフォルト) DiamondTrap (名前指定)
name "Default" 指定された名前 "DefaultScav" 指定された名前 "DefaultFrag" 指定された名前 "Default" 指定された名前
hitPoints 10 10 100 100 100 100 100 100
energyPoints 10 10 50 50 100 100 50 50
attackDamage 0 0 20 20 30 30 30 30
ClapTrap::name 該当なし 該当なし 該当なし 該当なし 該当なし 該当なし "Defalut_clap_name" 指定された名前 + "_clap_name"

テーブル 2: 各クラスのメンバー関数の挙動

メンバー関数 ClapTrap ScavTrap FragTrap DiamondTrap
attack -0 -20 -30 -30
takeDamage 引数の値
beRepaired 引数の値
guardGate - ☑︎ - ☑︎
highFivesGuys - - ☑︎ ☑︎
whoAmI - - - ☑︎
getName ☑︎ ☑︎ ☑︎ ☑︎
getHitPoints ☑︎ ☑︎ ☑︎ ☑︎
getEnergyPoints ☑︎ ☑︎ ☑︎ ☑︎
getAttackDamage ☑︎ ☑︎ ☑︎ ☑︎

キーワード、メモ:

‍* 多重継承のダイヤモンド構造

/ \
\ /
Represents a DiamondTrap robot, inheriting from both FragTrap and ScavTrap.
class DiamondTrap : public FragTrap, public ScavTrap {

DiamondTrapは2つのクラスから継承します。(ScavTrapFragTrap

* 「ダイヤモンド」継承問題

‍例えばmainでDiamondのオブジェクトの操作(takeDamagebeRepairedのメソッド)を行うコードについて。

‍mainの継承メソッド呼び出し。

DiamondTrap diamondUnit1("Gemini");
DiamondTrap diamondUnit2("Sparkle");
// ambiguous
diamondUnit2.takeDamage(40);
diamondUnit1.beRepaired(25);

クラスの定義

class DiamondTrap : public FragTrap, public ScavTrap { ... }
class FragTrap : public ClapTrap { ... }
class ScavTrap : public ClapTrap { ... }

コンパイルエラーが起きる。

make
c++ -Wall -Wextra -Wshadow -Werror -std=c++98 -MMD -MP -MF .deps/main.d -c main.cpp -o objs/main.o
main.cpp: In function ‘int main()’:
main.cpp:80:18: error: request for member ‘takeDamage’ is ambiguous
80 | diamondUnit2.takeDamage(40);
| ^~~~~~~~~~
In file included from main.cpp:24:
ClapTrap.hpp:64:10: note: candidates are: ‘void ClapTrap::takeDamage(unsigned int)’
64 | void takeDamage(unsigned int amount);
| ^~~~~~~~~~
ClapTrap.hpp:64:10: note: ‘void ClapTrap::takeDamage(unsigned int)’
main.cpp:81:18: error: request for member ‘beRepaired’ is ambiguous
81 | diamondUnit1.beRepaired(25);
| ^~~~~~~~~~
In file included from main.cpp:24:
ClapTrap.hpp:65:10: note: candidates are: ‘void ClapTrap::beRepaired(unsigned int)’
65 | void beRepaired(unsigned int amount);
| ^~~~~~~~~~
ClapTrap.hpp:65:10: note: ‘void ClapTrap::beRepaired(unsigned int)’
make: *** [Makefile:39: objs/main.o] Error 1

なぜ?

‍この構造は 2つの異なるオブジェクトを介して クラスの継承するため、継承したメソッドを呼び出すためには、::スコープ解決演算子(scope resolution)を使って基底クラスの名前を指定する必要がある。

対策1

::スコープ解決演算子によるメソッド呼び出し。

diamondUnit2.FragTrap::takeDamage(40);
diamondUnit1.ScavTrap::beRepaired(25);

対策2

‍基底クラスをvirtualクラスとして定義する。( 仮想継承

class DiamondTrap : public FragTrap, public ScavTrap { ... }
class FragTrap : virtual public ClapTrap { ... }
class ScavTrap : virtual public ClapTrap { ... }
覚え書き
まとめ

‍スコープ解決演算子を使って呼び出しでも十分課題の要件を満たすが、仮想継承の方式を採用しました。(以下は仮想継承の特性)

‍ 基底クラスのサブオブジェクトが1つになるためメモリ使用容量の削減できる。

継承の意図を明確にすることができる。

その他:

‍仮想継承の注意点も記載。複雑になる可能性もあるため、仮想継承の使用は慎重に行いましょう。

メモ → 仮想継承について, 仮想継承の事例

* attack()ScavTrapのメソッドを使うためオーバーライドしない。(virtualを付けない)

// Diamond.hpp の定義
void attack(const std::string &target); // Use ScavTrap's attack : not over ride
// Diamond.cpp のコード
void DiamondTrap::attack(const std::string &target) {
ScavTrap::attack(target); // Use ScavTrap's attack
}
void attack(const std::string &target)
Attack function implementation for DiamondTrap, using ScavTrap's attack.

動作結果

main.cpp
#include "ClapTrap.hpp"
#include "DiamondTrap.hpp"
#include "FragTrap.hpp"
#include "ScavTrap.hpp"
int main() {
std::cout << "--- ClapTrap Tests ---" << std::endl;
ClapTrap clapUnit1("BasicBot");
clapUnit1.attack("Wild Smeef");
clapUnit1.takeDamage(5);
clapUnit1.beRepaired(3);
std::cout << "--- ScavTrap Tests ---" << std::endl;
ScavTrap scavUnit1("Guardian");
scavUnit1.attack("Bandit");
scavUnit1.takeDamage(15);
scavUnit1.beRepaired(10);
scavUnit1.guardGate();
std::cout << "--- FragTrap Tests ---" << std::endl;
FragTrap fragUnit1("Blitz");
fragUnit1.attack("Psycho");
fragUnit1.takeDamage(35);
fragUnit1.beRepaired(20);
fragUnit1.highFivesGuys();
std::cout << "--- DiamondTrap Tests ---" << std::endl;
DiamondTrap diamondUnit1("Gemini");
DiamondTrap diamondUnit2("Sparkle");
DiamondTrap diamondUnit3;
DiamondTrap diamondUnit4 = diamondUnit1;
DiamondTrap diamondUnit5(diamondUnit2);
diamondUnit1.attack("Marauder");
// diamondUnit2.FragTrap::takeDamage(40);
// diamondUnit1.FragTrap::beRepaired(25);
// diamondUnit2.ScavTrap::takeDamage(40);
// diamondUnit1.ScavTrap::beRepaired(25);
// diamondUnit2.FragTrap::takeDamage(40);
// diamondUnit1.ScavTrap::beRepaired(25);
// diamondUnit2.ClapTrap::takeDamage(40);
// diamondUnit1.ClapTrap::beRepaired(25);
diamondUnit2.takeDamage(40);
diamondUnit1.beRepaired(25);
diamondUnit2.whoAmI();
diamondUnit3.highFivesGuys();
diamondUnit3.guardGate();
std::cout << "--- DiamondTrap Construction/Destruction Order ---" << std::endl;
{
DiamondTrap tempDiamond("Shiny");
tempDiamond.whoAmI();
}
return 0;
}
Header file for the DiamondTrap class, inheriting from FragTrap and ScavTrap.
void guardGate()
guardGate function implementation for ScavTrap.
Definition ScavTrap.cpp:92
出力
$ ./a.out
--- ClapTrap Tests ---
ClapTrap String constructor called for BasicBot
ClapTrap BasicBot attacks Wild Smeef, causing 0 points of damage!
ClapTrap BasicBot takes 5 points of damage!
ClapTrap BasicBot has 5 hit points remaining.
ClapTrap BasicBot repairs itself, regaining 3 hit points!
ClapTrap BasicBot now has 8 hit points and 8 energy points.
--- ScavTrap Tests ---
ClapTrap String constructor called for Guardian
ScavTrap String constructor called for Guardian
ScavTrap Guardian attacks Bandit, causing 20 points of damage!
ClapTrap Guardian takes 15 points of damage!
ClapTrap Guardian has 85 hit points remaining.
ClapTrap Guardian repairs itself, regaining 10 hit points!
ClapTrap Guardian now has 95 hit points and 48 energy points.
ScavTrap Guardian has entered Gate keeper mode.
--- FragTrap Tests ---
ClapTrap String constructor called for Blitz
FragTrap String constructor called for Blitz
FragTrap Blitz attacks Psycho, causing 30 points of damage!
ClapTrap Blitz takes 35 points of damage!
ClapTrap Blitz has 65 hit points remaining.
ClapTrap Blitz repairs itself, regaining 20 hit points!
ClapTrap Blitz now has 85 hit points and 98 energy points.
FragTrap Blitz says: "High fives, anyone?"
--- DiamondTrap Tests ---
ClapTrap String constructor called for Gemini_clap_name
FragTrap String constructor called for Gemini_clap_name
ScavTrap String constructor called for Gemini_clap_name
DiamondTrap String constructor called for Gemini
ClapTrap String constructor called for Sparkle_clap_name
FragTrap String constructor called for Sparkle_clap_name
ScavTrap String constructor called for Sparkle_clap_name
DiamondTrap String constructor called for Sparkle
ClapTrap String constructor called for Default_clap_name
FragTrap String constructor called for Default_clap_name
ScavTrap String constructor called for Default_clap_name
DiamondTrap Default constructor called
ClapTrap String constructor called for Gemini
FragTrap Copy constructor called for Gemini
ScavTrap Copy constructor called for Gemini
DiamondTrap Copy constructor called for Gemini
ClapTrap String constructor called for Default_clap_name
FragTrap String constructor called for Default_clap_name
ScavTrap String constructor called for Default_clap_name
DiamondTrap Default constructor called
DiamondTrap Assignation operator called for Default
ClapTrap Assignation operator called for Default
ScavTrap Gemini attacks Marauder, causing 20 points of damage!
ClapTrap Sparkle takes 40 points of damage!
ClapTrap Sparkle has 60 hit points remaining.
ClapTrap Gemini repairs itself, regaining 25 hit points!
ClapTrap Gemini now has 125 hit points and 48 energy points.
DiamondTrap name: Sparkle, ClapTrap name: Sparkle
FragTrap Default says: "High fives, anyone?"
ScavTrap Default has entered Gate keeper mode.
--- DiamondTrap Construction/Destruction Order ---
ClapTrap String constructor called for Shiny_clap_name
FragTrap String constructor called for Shiny_clap_name
ScavTrap String constructor called for Shiny_clap_name
DiamondTrap String constructor called for Shiny
DiamondTrap name: Shiny, ClapTrap name: Shiny
DiamondTrap Destructor called for Shiny
ScavTrap Destructor called for Shiny
FragTrap Destructor called for Shiny
ClapTrap Destructor called for Shiny
DiamondTrap Destructor called for Sparkle
ScavTrap Destructor called for Sparkle
FragTrap Destructor called for Sparkle
ClapTrap Destructor called for Sparkle
DiamondTrap Destructor called for Gemini
ScavTrap Destructor called for Gemini
FragTrap Destructor called for Gemini
ClapTrap Destructor called for Gemini
DiamondTrap Destructor called for Default
ScavTrap Destructor called for Default
FragTrap Destructor called for Default
ClapTrap Destructor called for Default
DiamondTrap Destructor called for Sparkle
ScavTrap Destructor called for Sparkle
FragTrap Destructor called for Sparkle
ClapTrap Destructor called for Sparkle
DiamondTrap Destructor called for Gemini
ScavTrap Destructor called for Gemini
FragTrap Destructor called for Gemini
ClapTrap Destructor called for Gemini
FragTrap Destructor called for Blitz
ClapTrap Destructor called for Blitz
ScavTrap Destructor called for Guardian
ClapTrap Destructor called for Guardian
ClapTrap Destructor called for BasicBot
覚え書き
その他
  • Wshadow , -Who-shadow compiler flags??

    ‍クラス複数のパスから継承する問題で、クラスの基底クラスと同じ名前のメンバー変数宣言があると、その変数が隠蔽されて意図しない動作になることがある。これをシャドウィングという。

    一般的な対策として、異なる名前を使用して解決する。

    -Wshadowフラグを付けることで、シャドウィングによる名前の競合に関する警告を出力します。

    シャドウィングはC++で扱うコードで発生する可能性がある。 -Wno-shadowはシャドウィングを使用する特別の理由がある場合に使うことがあるが、これは慎重に行いましょう。

レビューで説明につまった点

議題に上がった点

  • 仮想継承とは?仕組み?どんな課題を解決できるのか?
  • メモリの節約、コードの明確化、仮想継承におけるオーバーヘッドとは?
  • 仮想関数テーブルとは?
  • 仮想継承と通常の継承との違いとは?
  • オブジェクトがどのように作られるのか?
  • virtualデストラクタとは?
  • ダイナミックキャストとは?
  • protect継承とは?
  • 教えてもらった記事

    https://qiita.com/4_mio_11/items/aa71f18b24ab55e4cb3d

    https://blog.wizaman.net/archives/890

上記の内容について、まとめたノート

review.md

Other

  • ブランチの使い方

    main: 安定版

    feature/ex00: 各課題の機能開発を行う。

    docs: ここにpushすると、GitHub Actions workflowが動作してドキュメントが公開されます。

  • ドキュメントページ

    ‍C++ Moduleのプロジェクト毎にDoxygenを使ったドキュメントをまとめています。

    doxygen用のcssテーマは、Doxygen Awesomeを使用。

  • キーワード
    Clap : `to clap` 手を叩く。拍手、パンという音
    Scav : `to scavenge` 漁る、拾う、様子を伺いながら物を集める役(なぜかガードの機能を持つ??)
    Frag : `fragmentation grenade` 爆弾や手榴弾で敵を多王す行為
    Trap : 罠、仕掛け
    ClapTrap : 汎用的な戦闘ユニット
    ScavTrap : 資源回収
    FragTrap : 攻撃性の高い
    ゲームに登場するキャラクターから推測される。