復習 - ジェネリックコンテナ
CoddyのC++ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 69/104。
チャレンジ
簡単この章で学んだテンプレートの内容をすべて取り入れた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つ目の整数
- 2つ目の整数
- 3つ目の整数
- double型の値
- 文字列で表した真偽値(
trueまたはfalse)
次のようにしてコンテナの動作を示します。
- 容量10の
GenericContainer<int>を作成する pushAllを使って、3つの整数を一度に追加する- サイズを出力する:
Int container size: <size> printContainerを呼び出して整数を表示する- 容量5の
GenericContainer<double>を作成する - 個別に
pushを呼び出して、double型の値とリテラル2.5を追加する printContainerを呼び出してdouble型の値を表示する- 容量5の
GenericContainer<bool>を作成する - 真偽値の入力とリテラル
falseを追加する 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;
}
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタパラメータ付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ徹底解説Rule of Three / Five / Zero復習 - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () の演算子オーバーロード型変換演算子復習 - Matrixクラス自分で練習してみよう: C++オンラインコンパイラ