mirror of
https://github.com/affaan-m/ECC.git
synced 2026-09-08 07:37:48 +02:00
52 lines
1.7 KiB
Markdown
52 lines
1.7 KiB
Markdown
---
|
||||
|
|
paths:
|
|||
|
|
- "**/*.cpp"
|
|||
|
|
- "**/*.hpp"
|
|||
|
|
- "**/*.cc"
|
|||
|
|
- "**/*.hh"
|
|||
|
|
- "**/*.cxx"
|
|||
|
|
- "**/*.h"
|
|||
|
|
- "**/CMakeLists.txt"
|
|||
|
|
---
|
|||
|
|
# C++ パターン
|
|||
|
|
|
|||
|
|
> このファイルは [common/patterns.md](../common/patterns.md) を C++ 固有のコンテンツで拡張します。
|
|||
|
|
|
|||
|
|
## RAII(Resource Acquisition Is Initialization)
|
|||
|
|
|
|||
|
|
リソースのライフタイムをオブジェクトのライフタイムに結びつける:
|
|||
|
|
|
|||
|
|
```cpp
|
|||
|
|
class FileHandle {
|
|||
|
|
public:
|
|||
|
|
explicit FileHandle(const std::string& path) : file_(std::fopen(path.c_str(), "r")) {}
|
|||
|
|
~FileHandle() { if (file_) std::fclose(file_); }
|
|||
|
|
FileHandle(const FileHandle&) = delete;
|
|||
|
|
FileHandle& operator=(const FileHandle&) = delete;
|
|||
|
|
private:
|
|||
|
|
std::FILE* file_;
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 5の法則/0の法則
|
|||
|
|
|
|||
|
|
- **0の法則**: カスタムデストラクタ、コピー/ムーブコンストラクタ、代入が不要なクラスを優先する
|
|||
|
|
- **5の法則**: デストラクタ/コピーコンストラクタ/コピー代入/ムーブコンストラクタ/ムーブ代入のいずれかを定義する場合、5つすべてを定義する
|
|||
|
|
|
|||
|
|
## 値セマンティクス
|
|||
|
|
|
|||
|
|
- 小さい/トリビアルな型は値渡しにする
|
|||
|
|
- 大きな型は `const&` で渡す
|
|||
|
|
- 値で返す(RVO/NRVO に依存する)
|
|||
|
|
- シンクパラメータにはムーブセマンティクスを使用する
|
|||
|
|
|
|||
|
|
## エラーハンドリング
|
|||
|
|
|
|||
|
|
- 例外的な状況には例外を使用する
|
|||
|
|
- 存在しない可能性のある値には `std::optional` を使用する
|
|||
|
|
- 想定される失敗には `std::expected`(C++23)または結果型を使用する
|
|||
|
|
|
|||
|
|
## 参考
|
|||
|
|
|
|||
|
|
包括的な C++ パターンとアンチパターンについてはスキル: `cpp-coding-standards` を参照。
|