C++サンプル集

このドキュメントについて

なぜこのドキュメントを書くのか

 かねてより僕は、自分が、C/C++で学んできたことをまとめる意味でC++サンプル集をドキュメント化したいと思っていました。
 そういうドキュメントを持っておくと、何かアイディアに詰まったとき、あるいは、あるアルゴリズムを忘れてしまったときなど、自分のためにもあると便利です。
 そうした際、どのようなサンプル有用かという問題が出てきます。
 プリミティブな内容が含まれ、言語の本質に触れることができるサンプルとはどんなサンプルか。難しい問題です。
 ところで、C言語の教科書ともいうべき名著にプログラミング言語C(共立出版)という本があります。
 K&Rという愛称で知られるこの本は、素晴らしい本なのですが、C言語が、C++とまじりあい、C/C++という表現が一般化してきた現在(2019年)、その内容が若干古くなりつつあります。
 しかしながら、K&Rで紹介されているプログラムの数々は、現在も現役であり、特にアルゴリズムの学習には最適です。であれば、K&Rに記述されている内容をC++で記述するのはどうか、と思いつきました。
 ただK&RはC言語の教科書ですから、C++的な部分(オブジェクト指向、例外処理、テンプレート)などは含まれません。
 ここいらは別途、何かのC++向きなサンプルを実装する必要があると思います。
 ということで、このドキュメントは大きく3部に分かれます。
 第1部は、K&Rに述べられているサンプルの一部をC++で書き直したものです。
 K&Rをよく読むと、この本は標準ライブラリをどう作るかという内容であることがわかります。著者であるカーニハン&リッチー両氏が、実際にC言語のコンパイラ作成に深くかかわっていたこともその理由と思われます。
 それをC++で記述するにあたって、低い部分もそうですが、STLを使ってどう簡略化するか、なども行っています。
 ただ、このドキュメントには、元になるK&Rのソースは含まれません。ぜひK&Rを購入して、比べてみていただくと良いと思います。
 第2部は、C++のサンプル集の予定です。基本はC++のオブジェクト指向をうまく表現できるように、stringやlistやmap、あるいはarray(STLではvector)のミニマム版を自作してみたいと思います。
 これらはSTLにコンテナとして実装されているものですが、あえて、自作することで、中に詰まっているアルゴリズムを再認識することができます。
 また、汎用なアルゴリズム(ソートや2分岐、検索など)や、メモリプール作成、なども、すぐに手が届くところにあると便利ですね。
 あとデザインパターン(GoF)は有名ですが、その中でもよく使うもの、あるいはGoFに入ってなくても、1つのパターンとして使えるものがあると便利です。
 そんな感じで、書き進めたいと思います。
 第3部は、第1部、第2部がコンソールアプリのサンプルなのに対して、GUI環境でのサンプルを紹介したいと考えてます。
 今のところネイティブなWindowsアプリとして実装したいと考えています。
 サンプル集は、GitHubに公開しますが、まだまだ道半ばです。お読みの方がいらっしゃいましたら、長い目で見てやってください。

山ノ井靖(有限会社山ノ井商事)
E-mail: yasyamanoi@gmail.com

準備

 皆さんが、現在使っているパソコンの中にはVisualStudio2019がセットアップされていると仮定します。もしセットアップがまだの場合は、VisualStudioCommunityサイトから、ダウンロードしてください。
 そして新規プロジェクトVC++コンソールアプリのソリューションを作成してください。64ビット環境を想定しています。ですからsize_tが64ビットになります。
 このドキュメントのサンプルは、すべてVisualStudio2019で作成されています。
 ですが、ほとんどのサンプルは1ファイルで完結するものです。そういったものは、ドキュメントに記述されているソースコードに
CPPファイルに記述
#include <iostream>

int main()
{
    std::cout << "Hello World!\n";
}
 と書いてありますので、そのままコピペで実装できます。
 しかし、複数のソースファイルにまたがる場合は
Sample0001
function.h
void func();
function.cpp
#include <iostream>
#include "function.h"
void func(){
    //コード内容
}
main.cpp
#include <iostream>
#include "function.h"

int main()
{
    //コード内容
    func();
}
 のように記述します。この場合はprojects/Sample0001にサンプルのソリューションがあり、function.hなどの複数のファイルがそのプロジェクトに含まれることを意味します。ファイル-新規ファイルで追加できますが、サンプルをそのまま開くことも出きます。
 もしVisualStudio2019以降を新たにセットアップされている場合は(将来の話ですが)、ソリューション読み込みの際に、プロジェクトのバージョンを、最新のものに変更するかを聞いてくると思いますので、そこははい(yes)で変更していただいて大丈夫と思われます。

参考文献

プログラミング言語C第2版(K&R)、カーニハン&リッチー著、共立出版
プログラミング言語C++第4版(C++D4)、ビャーネ・ストラウストラップ著、SBクリエイティブ
C++D4という書籍の略称は本ドキュメントのみで使用されています。