こんにちは。19の@kegraと言います。
先月にtraP内で「実用C++ハンズオン」という講習会を開催しました。
これはどんな講習会?
C++(あるいはC言語)をアプリ開発に実用するための知識を学んでいく講習会です。
C++はちゃんと使えば決して悪くない言語なのですが、駆け出しレベルのエンジニアにとっては、現状どうしても以下のような用途に絞られてしまっています。
- プログラミング自体の入門
- 競技プログラミング
なぜC++はUnityやJavaScriptやPythonのように「実アプリを作って面白がりながら勉強する」立ち位置にあまりいないのでしょうか?[1]自分が思うに、それは「ファイル分割をする」「その辺で拾ったライブラリを適当に組み合わせる」ということをするためのハードルが高いせいだと考えています。
あとC言語からの類推に基づく「newしたら自分でdeleteしなければならない」みたいな誤解...[2]
逆に、そこさえ解決すれば多少の規模のあるアプリ開発をしたり、拾ったライブラリを使って巨人の肩に乗る開発が初心者にも可能になってくるであろうと思うわけです。
ということで、C++初心者が中級者にレベルアップするための知識セットをハンズオン形式で紹介しました。
開催内容
- 第1回: 分割コンパイル、ライブラリのリンク
- 第2回: CMakeの使い方
- 第3回: RAIIの理念、スマートポインタの使い方
- 第4回: テストとモック(+抽象クラスによるインターフェース)
- 第5回: パッケージマネージャの利用
ちょっと口頭で補足した部分も多いので資料は外部に見せられるほど整ってはいませんが、第1回だけはそこそこ真面目にスライドを作ったのでここに置いておきます。分割ビルド分かんないよ~~って人は読むと多少の参考になるかもしれません。
学習者の中にはコンパイルエラーが苦手と言う人が多いので、「こういうことをするとこういうエラーが出るよ。実際にやってみよう」みたいな話も入れました。コンパイルエラーは友達!
4/12 追記: スライドp51~57に誤った内容が含まれていることが指摘されたため、お詫びして訂正いたします。
グローバルや無名でない名前空間内に書かれた一般のクラス/構造体類、テンプレート、インライン関数は内部リンケージでなく外部リンケージを持ちます。[3]もしそうでなければ同じクラス型を扱う関数が複数の翻訳単位に作れることも説明できなくなってしまうはず...)
これらが複数の翻訳単位に書かれた上でエラーにならないのはある種の例外規定によるものであり、コンパイルの仕組みの都合上、各翻訳単位に1つずつ同じものが定義されている分には複数の定義が許されています。[4]
参考: Stack Overflow, Wikipedia
今後の開催
またいずれtraP内で開催すると思います。(もうちょっとお外にも見せられるくらいに資料を整備してあげた上でやりたいですね)
traPの講習会には、未経験者の人が最初の1歩を学ぶための「01講習会」とそれ以外の普通の講習会があります。「実用C++ハンズオン」は普通の講習会の方に分類されるものです。
01講習会のひとつとして「プログラミング基礎講習会」(リンク)というものがあり、ここでプログラミングの入門として基礎的なC++を学ぶことができます。
多くの人はプログラミング基礎講習会の後はUnityとC#でゲーム開発を学んだり、GoとTypeScriptでWeb開発を学んでいくことになるのですが、「さらに先の実用的なC++を学びたい!」と思った方にはぜひ実用C++ハンズオンを受けて欲しいと思います。
C++があれば、何でもできる!
では。
Siv3DとかDXライブラリはかなり上手くやっていると思います。あれらは「単一の大きなフレームワークに乗ることでライブラリを組み合わせる方法を学ばずにアプリを作ることを可能にする」という手法ですが、本講習会では特定のライブラリやコンパイラへ縛られないことに重点を置きました。 ↩︎
これは本当に勘違いしている人が多いのですが、本物のC++プログラマーはRAIIの思想に基づきスマートポインタなどを適切に使うため、普通のアプリケーションを作っている限り滅多なことではnewもdeleteも自分で書きません。主に使うのは
std::make_shared
とかそういうのです。そもそもクラス型もスタックメモリに置けるため普通の変数で十分なことが多いです。 ↩︎https://timsong-cpp.github.io/cppwp/n4861/basic.def.odr#13 ↩︎