Menu
Coddy logo textTech

まとめ:ジェネリックコンテナ

CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 69/104。

challenge icon

チャレンジ

簡単

この章で学んだテンプレートのすべてを統合する GenericContainer クラステンプレートを作成しましょう。要素を動的に格納し、テンプレート技術を通じて有用な操作を提供する、柔軟で型安全なコンテナを作成します。

コードは2つのファイルに分けて構成します:

  • GenericContainer.h: ここでクラステンプレートを定義します。GenericContainer は以下の要件を満たす必要があります:

    配列へのポインタを使用して要素を動的に格納し、現在のサイズと容量を追跡します。

    以下のコアメソッドを提供します:

    • 初期容量を受け取るコンストラクタ
    • 動的メモリを適切にクリーンアップするデストラクタ
    • push(T value) — コンテナに要素を追加します(このチャレンジでは、容量は常に十分であると仮定します)
    • get(size_t index) — 指定されたインデックスの要素を返します
    • getSize() — 現在の要素数を返します

    GenericContainer<T>& を受け取り、すべての要素をスペースで区切って出力し、最後に改行を出力する printContainer という関数テンプレートを追加します。

    GenericContainer<bool> 用に printContainer のテンプレート特殊化を作成し、10 の代わりに true または false を出力するようにします。

    GenericContainer<T>& と任意の数の値を受け取り、畳み込み式(fold expression)を使用して各値をコンテナにプッシュする、可変引数関数テンプレート pushAll を追加します。

  • main.cpp: 5つの入力(それぞれ別々の行)を読み取ります:
    1. 1つ目の整数
    2. 2つ目の整数
    3. 3つ目の整数
    4. double型の値
    5. 文字列としてのブール値("true" または "false"

    以下の手順でコンテナの動作を実演してください:

    1. 容量10の GenericContainer<int> を作成する
    2. pushAll を使用して、3つの整数を一度に追加する
    3. サイズを出力する:"Int container size: <size>"
    4. printContainer を呼び出して整数を表示する
    5. 容量5の GenericContainer<double> を作成する
    6. 個別の push 呼び出しを使用して、入力されたdouble値とリテラル 2.5 をプッシュする
    7. printContainer を呼び出してdouble値を表示する
    8. 容量5の GenericContainer<bool> を作成する
    9. 入力されたブール値とリテラル false をプッシュする
    10. printContainer を呼び出してブール値を表示する(true/false と表示されるはずです)

例えば、入力が 10, 20, 30, 3.14, "true" の場合:

Int container size: 3
10 20 30 
3.14 2.5 
true false 

このチャレンジでは、コンテナのためのクラステンプレート、カスタムのbool出力のためのテンプレート特殊化、そして柔軟な pushAll 関数のための可変引数テンプレートを組み合わせます。作成するコンテナはRAIIの原則に従って自身のメモリを管理し、テンプレートが適切なリソース管理とどのように統合されるかを示します。

自分で試してみよう

#include <iostream>
#include <string>
#include "GenericContainer.h"

using namespace std;

int main() {
    // 入力を読み込む
    int num1, num2, num3;
    double doubleVal;
    string boolStr;
    
    cin >> num1;
    cin >> num2;
    cin >> num3;
    cin >> doubleVal;
    cin >> boolStr;
    
    // 文字列を bool に変換する
    bool boolVal = (boolStr == "true");
    
    // TODO: 容量 10 の GenericContainer<int> を作成する
    
    // TODO: pushAll を使用して、3 つの整数を一度に追加する
    
    // TODO: サイズを表示する: "Int container size: <size>"
    
    // TODO: printContainer を呼び出して整数を表示する
    
    // TODO: 容量 5 の GenericContainer<double> を作成する
    
    // TODO: 個別の push 呼び出しを使用して、double 値と 2.5 を追加する
    
    // TODO: printContainer を呼び出して double 値を表示する
    
    // TODO: 容量 5 の GenericContainer<bool> を作成する
    
    // TODO: 入力された boolean 値と false を追加する
    
    // TODO: printContainer を呼び出して boolean 値を表示する
    
    return 0;
}

オブジェクト指向プログラミングのすべてのレッスン