Menu
CoddyTech

復習 - ジェネリックコンテナ

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のテンプレート特殊化を作成し、1や0の代わりにtrueまたはfalseを出力します。

    GenericContainer<T>&と任意の数の値を受け取り、畳み込み式を使ってそれぞれの値をコンテナに追加する、可変長関数テンプレートpushAllを追加します。たとえば(container.push(args), ...);のようにカンマ演算子で畳み込むと、引数ごとに呼び出しが1回実行されます。

  • 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 

この課題では、コンテナにクラステンプレートを、独自の真偽値表示にテンプレート特殊化を、柔軟な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: 入力された真偽値とfalseを追加する
    
    // TODO: printContainerを呼び出して真偽値を表示する
    
    return 0;
}

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

自分で練習してみよう: C++オンラインコンパイラ