C++ プロジェクト制作 — 全 8 作
STL、RAII、スマートポインタ、テンプレート、並行処理 — 学んできた全要素を使って完成させるプロジェクトを 8 つ用意しました。小→大で難易度順。ポートフォリオの種として GitHub にアップする前提で書かれています。
Project 1易単語頻度カウンタ
所要時間: 2–3 時間 / 200 行前後
file I/Ostd::mapstd::stringsort
テキストファイルを読み込み、単語ごとの出現回数を上位 N 個表示する CLI ツール。C で書くと辞書の自作が大変だった部分が、std::map 一撃で解決します。
最小仕様
./wordcount file.txt -n 10 で上位 10 件表示
- 大文字小文字区別しない、記号除去
- 降順(同値なら辞書順)
発展
- 複数ファイル対応(ディレクトリ再帰 =
std::filesystem::recursive_directory_iterator)
- ストップワード除外、形態素解析連携
- 並列化(第 60 回 map-reduce)
Project 2易TODO CLI(JSON 永続化)
所要時間: 4–6 時間 / 300 行前後
クラスvectoroptionalファイル I/O
タスク追加・完了・削除できるターミナル TODO。JSON(外部ライブラリ nlohmann/json 推奨)で ~/.todo.json に保存。
最小仕様
todo add "買い物", todo done 3, todo list
- ID / タイトル / 完了フラグ / 作成日
- 空 optional 期限を std::optional で
発展
- タグ・締切・優先度
- 色付き出力(rang)
- 同期バックエンド(REST API)
Project 3中簡易電卓(AST パーサ)
所要時間: 1–2 日 / 400 行前後
variantunique_ptr再帰下降enum class
"1+2*(3-4)" のような式を構文木にパースして評価する電卓。variant で Token、unique_ptr で AST ノードを表現。
最小仕様
- 四則演算 + 括弧 + 単項マイナス
- float / double の扱い
- エラー時は例外を投げて main で catch
発展
- 変数代入、if 式、関数定義
- REPL(continuous evaluation)
- JIT(llvm / asmjit)
Project 4中ファイル重複検出ツール
所要時間: 1 日 / 350 行前後
filesystemSHA-256threadunordered_map
指定ディレクトリ以下を走査し、内容が同じファイルをハッシュ値でグループ化。大きい順に表示。
最小仕様
std::filesystem::recursive_directory_iterator で走査
- SHA-256(OpenSSL / picosha2)でハッシュ
- unordered_map<hash, vector<path>> に集約
発展
- std::thread + queue でハッシュ計算を並列化
- 削除提案モード(safe delete)
- GUI ラッパ(Qt)
Project 5中2D ゲーム: 15 パズル
所要時間: 2–3 日 / 500 行前後
SDL2 / SFMLarrayクラス設計random
4×4 の 15 パズルを SDL2 か SFML で。マウス・キーボード対応、シャッフル、ゴール判定。C++ のクラス設計とゲームループの理解に。
最小仕様
- Board, Tile, Renderer クラス
std::array<std::array<int,4>,4> で盤面
- シャッフルは
std::shuffle + mt19937
発展
- 最短経路(IDA*)でソルバ表示
- 画像タイル / 音
- 別パズル(数独、テトリス)へ横展開
Project 6難自作ベクトル(完全版)
所要時間: 2–3 日 / 600 行前後
templateRule of 5iteratorallocator
std::vector 相当をゼロから実装。Rule of 5、iterator、reserve/resize、strong exception guarantee 全て。std ライブラリ中身の理解に最強の練習。
最小仕様
- push_back / pop_back / at / operator[]
- Random-access iterator(pointer alias で OK)
- copy / move / dtor を正しく
- ASan / UBSan でバグ 0
発展
- カスタム allocator
- SBO(short buffer optimization)
- GoogleTest で 100 テスト書く
Project 7難TCP エコーサーバ
所要時間: 3–5 日 / 700 行前後
socket APIthread / asyncmutexqueue
クライアント複数接続を受け、1 本のスレッドで処理するソケットサーバ。select/epoll を使わない版は thread + queue で。Boost.Asio を使う版と両方経験できると大きい。
最小仕様
- listen / accept ループ(main スレッド)
- クライアントごとにスレッド or ワーカースレッドプール
- 受信内容を同名で返す
発展
- epoll / kqueue による 1 万接続対応
- プロトコル拡張(チャットルーム)
- TLS(OpenSSL)
Project 8難ミニコンパイラ(C のサブセット → x86)
所要時間: 1–2 週間 / 1500 行前後
lexer / parserASTcodegenvariant
C のサブセット(int / if / while / 関数)をx86-64 アセンブリに翻訳する。低レイヤを知りたい人のための C コンパイラ作成入門(日本語)を C++ で書き直すと、モダン C++ の良さが分かる。
最小仕様
- Token / AST / IR / asm の 4 層
- variant でノード種別
- return / 算術 / 代入 / 制御構造
発展
- ポインタ / 配列 / 構造体
- LLVM IR を吐く版
- ブラウザで動く WebAssembly 出力