まとめ:ジェネリックコンテナ
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>&と任意の数の値を受け取り、畳み込み式(fold expression)を使用して各値をコンテナにプッシュする、可変引数関数テンプレートpushAllを追加します。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 このチャレンジでは、コンテナのためのクラステンプレート、カスタムの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;
}
オブジェクト指向プログラミングのすべてのレッスン
3コンストラクタとデストラクタ
デフォルトコンストラクタ引数付きコンストラクタコピーコンストラクタムーブコンストラクタコンストラクタ初期化リスト委譲コンストラクタデストラクタ詳解Rule of Three / Five / Zeroまとめ - Stringクラス6演算子オーバーロード
演算子オーバーロード入門算術演算子のオーバーロード比較演算子のオーバーロードストリーム演算子代入演算子のオーバーロード[] と () 演算子のオーバーロード型変換演算子まとめ:Matrix クラス